CodeForces - 449B 最短路(迪杰斯特拉+堆优化)判断最短路路径数
题意:
给出n个点m条公路k条铁路。
接下来m行
u v w //u->v 距离w
然后k行
v w //1->v 距离w
如果修建了铁路并不影响两点的最短距离,那么修铁路是没必要的
求能删掉多少条铁路
题解:
把公路和铁路放一起构成一个图,然后跑一边最短路。最后如果最短路结果小于铁路的长度,那么这条铁路就没必要修
如果最短路结果等于铁路的长度,要先判断一下这个最短路是不是一条,如果这条最短路个数多于一条那么这条铁路就没必要修
怎么判断最短路路径数是不是大于1?
1 while(!r.empty())
2 {
3 str1=r.top();
4 r.pop();
5 int u=str1.v;
6 if(vis[u]) continue;
7 vis[u]=1;
8 for(int i=head[u]; i!=-1; i=e[i].nex)
9 {
10 int v=e[i].v;
11 int a=e[i].a;
12 if(dis[v]>a+dis[u])
13 {
14 in[v]=1;
15 dis[v]=a+dis[u];
16 r.push(shudui1(v,dis[v]));
17 }
18 else if(dis[v]==a+dis[u])
19 {
20 in[v]++;
21 }
22 }
23 }
这个in数组就是来判断,从起点1到终点i的最短路路径数的数量
代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<queue>
6 #include<vector>
7 #include<math.h>
8 using namespace std;
9 const int INF=0x3f3f3f3f;
10 const int maxn=1e5+5;
11 typedef long long ll;
12 const ll MAX=1e17;
13 const ll inf=(ll)1<<61;
14 struct shudui1
15 {
16 int v,c;
17 shudui1(int x=0,int y=0):v(x),c(y) {}
18 bool operator < (const shudui1 q)const
19 {
20 return c>q.c;
21 }
22 } str1;
23 struct node
24 {
25 int a,v,nex;
26 } e[maxn*20];
27 int tot,dis[maxn],p[70],vis[maxn],head[maxn],in[maxn],x[maxn],y[maxn];
28 int n,m,k;
29 void add(int u,int v,int a)
30 {
31 e[tot].v=v,e[tot].a=a;
32 e[tot].nex=head[u];
33 head[u]=tot++;
34 //printf("%d %d\n",tot-1,v);
35 }
36 priority_queue<shudui1>r; //里面的数据默认是从小到大排序,这样就不用通过for循环遍历在每一次找v里面的最小值,可以直接找到最小值,减少代码运行次数
37 int JK(int s)
38 {
39 memset(dis,INF,sizeof(dis));
40 memset(vis,0,sizeof(vis));
41 dis[s]=0;
42 str1.v=s;
43 str1.c=0;
44 r.push(str1);
45 while(!r.empty())
46 {
47 str1=r.top();
48 r.pop();
49 int u=str1.v;
50 if(vis[u]) continue;
51 vis[u]=1;
52 for(int i=head[u]; i!=-1; i=e[i].nex)
53 {
54 int v=e[i].v;
55 int a=e[i].a;
56 if(dis[v]>a+dis[u])
57 {
58 in[v]=1;
59 dis[v]=a+dis[u];
60 r.push(shudui1(v,dis[v]));
61 }
62 else if(dis[v]==a+dis[u])
63 {
64 in[v]++;
65 }
66 }
67 }
68 // for(int i=1;i<=n;++i)
69 // printf("%d\n",dis[i]);
70 int ans=0;
71 for(int i=1;i<=k;++i)
72 {
73 if(dis[x[i]]<y[i]) ans++;
74 else if(dis[x[i]]==y[i] && in[x[i]]>1)
75 {
76 in[x[i]]--;
77 ans++;
78 }
79
80 }
81 return ans;
82 }
83 int main()
84 {
85 scanf("%d%d%d",&n,&m,&k);
86 for(int i=0; i<=n; i++)
87 {
88 dis[i]=INF;
89 }
90 memset(head,-1,sizeof(head));
91 for(int i=1; i<=m; i++)
92 {
93 int u,v,w;
94 scanf("%d %d %d",&u,&v,&w);
95 add(u,v,w);
96 add(v,u,w);
97 }
98 for(int i=1; i<=k; i++)
99 {
100 int v,w;
101 scanf("%d %d",&x[i],&y[i]);
102 add(1,x[i],y[i]);
103 add(x[i],1,y[i]);
104 }
105 cout<<JK(1)<<endl;
106 return 0;
107 }
CodeForces - 449B 最短路(迪杰斯特拉+堆优化)判断最短路路径数的更多相关文章
- pat1003 迪杰斯特拉法和dfs求最短路
本题的背景是求定点和定点之间的最短路问题(所有的最短路 不是一个解 是全部解,方法手段来自数据结构课程中的迪杰斯特拉算法和dfs(深度优先遍历). 分别用两种方法编程如下代码 dfs #includ ...
- HDU 2680 最短路 迪杰斯特拉算法 添加超级源点
Choose the best route Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- 最短路——迪杰斯特拉算法 HDU_3790
初识最短路,今天只弄了一个迪杰斯特拉算法,而且还没弄成熟,只会最基本的O(n^2),想弄个优先队列都发现尼玛被坑爆了,那个不应该用迪杰斯特拉算法写 表示还是不会优化版的迪杰斯特拉算法,(使用优先队列) ...
- POJ 1062 昂贵的聘礼 (最短路 迪杰斯特拉 )
题目链接 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请 ...
- hdu2544 迪杰斯特拉题目优化
点击打开题目链接 迪杰斯特拉的用法不多讲,详见 点击打开链接 . 下面两个代码: 这个是用邻接矩阵存图的迪杰斯特拉. #include<stdio.h> int main() { int ...
- HUD 2544 最短路 迪杰斯特拉算法
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 迪杰斯特拉(Dijkstra) 最短路算法
直接看B站视频吧: https://www.bilibili.com/video/BV1QK411V7V4/
- Bumped!【迪杰斯特拉消边、堆优化】
Bumped! 题目链接(点击) Peter returned from the recently held ACM ICPC World Finals only to find that his r ...
- bfs输出路径 && 最短路(迪杰斯特拉)输出路径
问题描述 解决方法 1.像第一个问题那就是最短路问题(我代码采用迪杰斯特拉算法)实现 2.换乘次数最少,那就用bfs广搜来寻找答案.但是我的代码不能保证这个最少换乘是最短路程 代码 1 #includ ...
随机推荐
- JAR冲突问题的解决以及运行状态下如何查看加载的类
今天碰到群里小伙伴问,线上程序好像有多个不同版本的Netty包,怎么去看到底加载了哪一个? 在说如何看之前,先来说说,当你开始意识到项目里有多个不同版本的Jar包,都是因为遇到了这几个异常: java ...
- Mybatis 报错java.sql.SQLException: No suitable driver found for http://www.example.com
运行项目报错 Error querying database. Cause: java.sql.SQLException: No suitable driver found for http://ww ...
- MySQL where 条件字句查询
where 条件字句 搜索条件可由一个或多个逻辑表达式组成 , 结果一般为布尔值 逻辑运算符 运算符 语法 描述 and && a and b a && b 逻辑与 两 ...
- LeetCode563. 二叉树的坡度
题目 1 class Solution { 2 public: 3 int ans = 0; 4 int findTilt(TreeNode* root) { 5 postOrder(root); 6 ...
- 相对论中的光速c不变,这么讲!你总能理解了吧!
今天谈谈相对论的假设基础--光速不变,很多人都知道爱因斯坦的相对论,也知道相对论的理论基础是光速不变,即无论参考哪个参照系,光的速度都是不变的,这个很难得理解的问题.我之前看过别人的理解,也自己思考怎 ...
- PCB导线长宽与电源压降
为了计算PCB中电源线走线后的压降,需要知道PCB中使用的铜的电阻率, PCB板中的铜是直接贴上去的铜箔,因此可以当成纯铜(我问了PCB打样的厂家他们的铜的电阻率,但是他们给我说不知道,所以干脆就当成 ...
- jquery 数据查询
jquery 数据查询 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- Java并发组件三之Semaphore
使用场景:常用于使用有限的资源,限制线程并发的最大数量.默认情况下,信号量是非公平性的(先等待先执行为公平.类似于买东西的时候大家排队付款,先来的先付款是公平的.但是这时候有人插队,那就是非公平的)设 ...
- https://www.cs.cmu.edu/~dga/papers/cuckoo-conext2014.pdf 检验hash冲突
https://github.com/google/cityhash We like to test hash functions with SMHasher, among other things. ...
- 使用 IPset 进行端口敲门
端口敲门(Port knocking)技术,即服务通过动态的添加 iptables 规则来隐藏系统开启的服务,使用自定义的一系列序列号来「敲门」,使系统开启需要访问的服务端口,才能对外访问.不使用时, ...