题意:

给出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 最短路(迪杰斯特拉+堆优化)判断最短路路径数的更多相关文章

  1. pat1003 迪杰斯特拉法和dfs求最短路

    本题的背景是求定点和定点之间的最短路问题(所有的最短路 不是一个解  是全部解,方法手段来自数据结构课程中的迪杰斯特拉算法和dfs(深度优先遍历). 分别用两种方法编程如下代码 dfs #includ ...

  2. HDU 2680 最短路 迪杰斯特拉算法 添加超级源点

    Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  3. 最短路——迪杰斯特拉算法 HDU_3790

    初识最短路,今天只弄了一个迪杰斯特拉算法,而且还没弄成熟,只会最基本的O(n^2),想弄个优先队列都发现尼玛被坑爆了,那个不应该用迪杰斯特拉算法写 表示还是不会优化版的迪杰斯特拉算法,(使用优先队列) ...

  4. POJ 1062 昂贵的聘礼 (最短路 迪杰斯特拉 )

    题目链接 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请 ...

  5. hdu2544 迪杰斯特拉题目优化

    点击打开题目链接 迪杰斯特拉的用法不多讲,详见  点击打开链接 . 下面两个代码: 这个是用邻接矩阵存图的迪杰斯特拉. #include<stdio.h> int main() { int ...

  6. HUD 2544 最短路 迪杰斯特拉算法

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. 迪杰斯特拉(Dijkstra) 最短路算法

    直接看B站视频吧: https://www.bilibili.com/video/BV1QK411V7V4/

  8. Bumped!【迪杰斯特拉消边、堆优化】

    Bumped! 题目链接(点击) Peter returned from the recently held ACM ICPC World Finals only to find that his r ...

  9. bfs输出路径 && 最短路(迪杰斯特拉)输出路径

    问题描述 解决方法 1.像第一个问题那就是最短路问题(我代码采用迪杰斯特拉算法)实现 2.换乘次数最少,那就用bfs广搜来寻找答案.但是我的代码不能保证这个最少换乘是最短路程 代码 1 #includ ...

随机推荐

  1. linux查看文件夹和磁盘内存及服务器对应的ip

    多进程统计cpu 数目 n_cpu = multiprocessing.cpu_count() print(n_cpu) 查看文件夹占用磁盘空间 du -h --max-depth=1 /path 查 ...

  2. Entity与Entity之间的相互转化

    一.两个实体类的属性名称对应之间的转化 1.两个实体类 public class Entity1 { private Integer id; private String name; private ...

  3. uni-app开发经验分享十四:小程序超过2M限制的方法——分包加载

      起初小程序上线时,微信限制了代码包不能超过1MB,后来功能变大变成了2M了,限制大小是出于对小程序启动速度的考虑,希望用户在使用任何一款小程序时,都能获得一种"秒开"体验.但是 ...

  4. 飞机大战(1)--添加logo和加载动画

    注:以下代码都是用scratch 3.0版本编写 素材链接: 链接:https://pan.baidu.com/s/1sXqeZVuFgVTYT0OtqxXilw 提取码:1126 一.背景添加 导入 ...

  5. 支付宝沙箱环境使用(Alipay Easy SDK ) .Net示例

    新版服务端 SDK(Alipay Easy SDK)适用于 Java.C#.PHP 编程语言,对开放能力的 API 进行了更加贴近高频场景的精心设计与裁剪,简化了服务端调用方式,让开发者享受极简编程体 ...

  6. java基础-01代理类

    简单的代理类实现案例主实现类:ProxyTestimport java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;im ...

  7. JavaScript中的异步函数

    JavaScript中的异步函数 ES8 的 async/await 旨在解决利用异步结构组织代码的问题.为此, ECMAScript 对函数进行了扩展,为其增加了两个新关键字: async 和 aw ...

  8. TekRADIUS5.5安装教程

    1.下载地址:https://www.kaplansoft.com/TekRADIUS/release/tekradius.zip 2.解压安装,双击一步默认安装下来就是了 3.配置连接数据库: 4. ...

  9. 【rz】【sz】参数详解

    参数 SYNOPSIS sz [-+8abdefkLlNnopqTtuvyY] file ... b:以二进制方式,默认为文本方式 e:对所有控制字符转义 待续 常见问题: 1.xshell 使用rz ...

  10. <script>元素

    简介 向HTML页面中插入JavaScript的主要方法,就是使用'<'script'>'元素. 标签的位置 现代Web应用程序一般都把全部的JavaScript饮用放在'<'bod ...