题意:

给出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】vim关闭终端的时候,忘记退出vim怎么办

    有些时候经常是关闭终端,但是忘记退出vim编辑的文本,每次登陆的时候会提示这个错误 其实很简单,在该文本的路径下,有一个隐藏文件 叫.xxx.txt.swp文件(xxx就是你退出忘记关闭的文件名). ...

  2. 计网Q1:多个方面比较电路交换、报文交换和分组交换的主要优缺点

    网上看到的带佬儿的帖子......膜过来<doge 原文链接: https://blog.csdn.net/njchenyi/article/details/1540657 电路交换: 由于电路 ...

  3. 前端面试准备笔记之JavaScript(04)

    01. DOM的本质 xml是一种可扩展的标记性语言,可扩展就是可以描述任何结构的数据,他是一棵树,可以自定义标签,可以自己扩展. html也是一种特定的xml,他规定了一些标签的名称,结构与xml是 ...

  4. Python赋值、浅复制和深复制

    Python赋值.浅复制和深复制 ​ 首先我们需要知道赋值和浅复制的区别: 赋值和浅复制的区别 赋值,当一个对象赋值给另一个新的变量时,赋的其实是该对象在栈中的地址,该地址指向堆中的数据.即赋值后,两 ...

  5. Jmeter非GUI界面对阿里云服务器压测

    一.Jmeter非GUI界面 参数讲解 讲解:非GUI界面,压测参数讲解             -h 帮助            -n 非GUI模式            -t 指定要运行的 JMe ...

  6. 一种优化递归算法的方法(javascript)

    看书的时候看到了这个比较酷的方法,分享一下. 一.问题描述:代码如下,我们以计算阶乘(factorial)为例,当重复调用factorial(9),factorial(8),factorial(7)的 ...

  7. SpringBoot 报错: Circular view path [readingList] 解决办法

    spring boot报错: Circular view path [readingList]: would dispatch back to the current handler URL [/re ...

  8. 遍历仓库里的 commit log 替换author

    #!/bin/sh # 遍历仓库里的 commit log, 替换author git filter-branch --env-filter ' an="$GIT_AUTHOR_NAME&q ...

  9. Bitter.Core系列三:Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore ORM 之 示例模型创建

    在具体数据库操作之前,我们先准备好四张表以及相对应数据库操作模型: 学生表,年级表,班级表,学分表.示例数据库表,如下代码(MSSQL 为例) --学生表 CREATE TABLE t_student ...

  10. 第一个 Maven 应用程序

    概述 使用 Maven 创建一个 Java Web 应用程序 创建 Maven 项目 选择 File -> New -> Project... 选择 Maven 项目 填写项目信息 选择工 ...