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 ...
随机推荐
- 【ORA】ORA-32004: 问题分析和解决
今天做一个特殊的实验,需要重启数据库 数据库关闭没有问题 SQL> shutdown immediate; Database closed. Database dismounted. ORACL ...
- AQS之ReentrantReadWriteLock写锁
用法 1.1 定义一个安全的list集合 public class LockDemo { ArrayList<Integer> arrayList = new ArrayList<& ...
- [Usaco2015 dec]Breed Counting
原题链接https://www.lydsy.com/JudgeOnline/problem.php?id=4397 用线段树维护区间和即可.时间复杂度\(O((N+Q)logN)\). #includ ...
- SW3516中文资料书
SW3516 是一款高集成度的快充车充芯片, 支持 A+C 口任意口快充输出, 支持双口独立限流.其集成了 5A 高效率同步降压变换器, 支持 PPS/PD/QC/AFC/FCP/SCP/PE/SFC ...
- Mybatis Plus 3.4版本之后分页插件的变化
一.MybatisPlusInterceptor 从Mybatis Plus 3.4.0版本开始,不再使用旧版本的PaginationInterceptor ,而是使用MybatisPlusInter ...
- kubernetes备份恢复之velero
Velero备份.恢复.迁移Kubernetes集群 Velero简介 Velero 地址:https://github.com/vmware-tanzu/velero Velero属于VMWare开 ...
- 夯实基础系列一:Java 基础总结
前言 大学期间接触 Java 的时间也不短了,不论学习还是实习,都让我发觉基础的重要性.互联网发展太快了,各种框架各种技术更新迭代的速度非常快,可能你刚好掌握了一门技术的应用,它却已经走在淘汰的边缘了 ...
- 笔记 | 吴恩达新书《Machine Learning Yearning》
这本书共112页,内容不多,偏向于工程向,有很多不错的细节,在此记录一下. 0 书籍获取 关注微信公众号"机器学习炼丹术",回复[MLY]获取pdf 1 测试集与训练集的比例 2 ...
- 借助 AppleScript 一键打开工作空间
我有个小毛病:同时只能在一个工程里工作. 假如让我开四五个 Webstorm,在工程里 A 改个Bug,然后又到工程 B 里加个需求,再去工程 C 发个版,切来切去一会儿就懵了. 于是有了这个项目:m ...
- goroutine 分析 协程的调度和执行顺序 并发写 run in the same address space 内存地址 闭包 存在两种并发 确定性 非确定性的 Go 的协程和通道理所当然的支持确定性的并发方式(
package main import ( "fmt" "runtime" "sync" ) const N = 26 func main( ...