CF449B Jzzhu and Cities 迪杰斯特拉最短路算法
CF449B Jzzhu and Cities
其实这一道题并不是很难,只是一个最短路而已,请继续看我的题解吧~(^▽^)
AC代码:
#include<bits/stdc++.h>
#define maxn 3000005
#define pa pair<long long,long long>
#define inf 1000000000000000000ll
using namespace std;
long long n,m,k;
struct edge{
long long val,to;
};
bool vis[maxn];
long long dis[maxn],mark[maxn];
priority_queue<pa,vector<pa>,greater<pa> > q;
vector<edge> e[maxn*3];
long long ans;
void dijkstra()
{
memset(vis,0,sizeof(vis));
dis[1]=0;
q.push(make_pair(0,1));
while(!q.empty()){
int x=q.top().second;
q.pop();
if(vis[x])
continue;
vis[x]=1;
for(int i=0;i<e[x].size();i++){
int y=e[x][i].to;
if(dis[x]+e[x][i].val<=dis[y]){
if(mark[y]){
mark[y]=0;
}
if(dis[x]+e[x][i].val<dis[y]){
dis[y]=dis[x]+e[x][i].val;
q.push(make_pair(dis[y],y));
}
}
}
}
}
void addedge(long long x,long long y,long long v){
edge tmp;
tmp.to=y;
tmp.val=v;
e[x].push_back(tmp);
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=1;i<=n;i++)
dis[i]=inf;
for(int i=1;i<=m;i++){
long long x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
addedge(x,y,z);
addedge(y,x,z);
}
for(int i=1;i<=k;i++){
long long y,z;
scanf("%lld%lld",&y,&z);
if(dis[y]>z)
{
dis[y]=z;
q.push(make_pair(z,y));
mark[y]=1;
}
}
dijkstra();
for(int i=1;i<=n;i++)
ans+=mark[i];
printf("%lld\n",k-ans);
}
详解
那么我们来简化一下题目的含义
就是说有n个城市
1号城市是起点(树的根)
有m条普通边
有k条特殊边
问最多能删掉多少条边,能使最短路径不变
那么我们就可以先把n+k条边跑一遍dijkstra
然后就求出来了每个城市之间的最短路
在跑最短路的过程中判断这k条特殊边是否去掉后不影响最短路
但是这个题还有一个很坑人的bug
就像样例2中的一样,那k条特殊边可能会重复
那其实我们只需要留下来一条最短的就行了
用这个最短的一条去构建最短路
剩下的就直接删掉了
最后只需要用总边数减去剩余的特殊边的数量就行啦!~
CF449B Jzzhu and Cities 迪杰斯特拉最短路算法的更多相关文章
- 最短路径之迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...
- 最短路径 - 迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...
- 迪杰斯特拉算法——PAT 1003
本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究 ...
- PAT 1087 All Roads Lead to Rome[图论][迪杰斯特拉+dfs]
1087 All Roads Lead to Rome (30)(30 分) Indeed there are many different tourist routes from our city ...
- hdu 1595 find the longest of the shortest(迪杰斯特拉,减去一条边,求最大最短路)
find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 ...
- Bumped!【迪杰斯特拉消边、堆优化】
Bumped! 题目链接(点击) Peter returned from the recently held ACM ICPC World Finals only to find that his r ...
- C#迪杰斯特拉算法
C#迪杰斯特拉算法 网上有许多版本的,自己还是写一个理解点 Dijkstra.cs public class Dijkstra { private List<Node> _nodes; p ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- 【算法杂谈】LJX的迪杰斯特拉算法报告
迪杰斯特拉(di jie qi)算法 这里有一张图: 假设要求从1号节点到5号节点的最短路.那么根据迪杰斯特拉算法的思想,我们先看: 节点1,从节点1出发的一共有3条路,分别是1-6.1-3.1-2. ...
随机推荐
- Codeforces Round #184 (Div. 2)
A. Strange Addition (目前的做法好像做烦了) 统计数的\(mask\),表示个.十.百位上是否是0,共8种数. 枚举8种数组成的所有情况\(2^8\),记录最大数量. B. Con ...
- Spring Cloud探路(一) Erueka服务器的建立
组件名:Netflix Eureka 作用:支撑微服务的自注册.自发现,提供负载均衡能力 开发环境使用IDEA 1.新建Eureka Server,新建maven项目,配置pom.xml <p ...
- P1088 上台阶
题目描述 楼梯有 \(n(1 \le n \le 50)\) 阶台阶,上楼时可以一步上 \(1\) 阶,也可以一步上 \(2\) 阶,也可以一步上 \(3\) 阶,编程计算共有多少种不同的走法. 输入 ...
- 使用cnpm i -S axios 遇到报错Install fail! Error: EISDIR: illegal operation on a directory, symlink..........的解决办法
“今天本来想在cnpm 环境下安装axios,但是在安装axios的时候出现了一些问题.使用cnpm淘宝镜像库下载安装axios的时候报错 Install fail! Error: EISDIR: i ...
- linux 注册一个 PCI 驱动
为了被正确注册到内核, 所有的 PCI 驱动必须创建的主结构是 struct pci_driver 结构. 这个结构包含许多函数回调和变量, 来描述 PCI 驱动给 PCI 核心. 这里是这个结构的一 ...
- Tufurama CodeForces - 961E (cdq分治)
题面 One day Polycarp decided to rewatch his absolute favourite episode of well-known TV series " ...
- CentOS7.6部署ceph环境
CentOS7.6部署ceph环境 测试环境: 节点名称 节点IP 磁盘 节点功能 Node-1 10.10.1.10/24 /dev/sdb 监控节点 Node-2 10.10.1.20/24 /d ...
- python 实现整数的反转:给定一个整数,将该数按位逆置,例如给定12345变成54321,12320变成2321.
给定一个n位(不超过10)的整数,将该数按位逆置,例如给定12345变成54321,12320变成2321. # 第一种方法,使用lstrip函数去反转后,数字前面的0 import math num ...
- 学习python资料
资料链接:https://www.cnblogs.com/wupeiqi/articles/5433893.html
- 洛谷P-4782 2-sat+Tarjan
https://www.luogu.org/problemnew/solution/P4782 这里的大佬已经说的够好了 #include<iostream> #include<cs ...