题意:

给出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. 【JS学习】for-in与for-of

    前言:本博客系列为学习后盾人js教程过程中的记录与产出,如果对你有帮助,欢迎关注,点赞,分享.不足之处也欢迎指正,作者会积极思考与改正. 总述: 名称 遍历 适用 for-in 索引 主要建议白能力对 ...

  2. 通过JS逆向ProtoBuf 反反爬思路分享

    前言 本文意在记录,在爬虫过程中,我首次遇到Protobuf时的一系列问题和解决问题的思路. 文章编写遵循当时工作的思路,优点:非常详细,缺点:文字冗长,描述不准确 protobuf用在前后端传输,在 ...

  3. 【Java】网络编程之NIO

    简单记录 慕课网-解锁网络编程之NIO的前世今生 & 一站式学习Java网络编程 全面理解BIO/NIO/AIO 内容概览 文章目录 1.[了解] NIO网络编程模型 1.1.NIO简介 1. ...

  4. 你不知道的Linux目录

    Linux二级目录及其对应的作用 主要文件

  5. Doris

    Doris 基本概念 Doris 是基于 MPP 架构的交互式 SQL 数据仓库,主要用于解决近实时的报表和多维分析. Doris 分成两部分 FE 和 BE ,FE 负责存储以及维护集群元数据.接收 ...

  6. Android根据pdf模板生成pdf文件

    我们需要生成一些固定格式的pdf文件或者一些报表数据,那么我们可以用 iText包去做. 需要包含的jar包:iText-5.0.6.jar    iTextAsian.jar ,怎样jar包导入工程 ...

  7. RecyclerView 源码分析(二) —— 缓存机制

    在前一篇文章 RecyclerView 源码分析(一) -- 绘制流程解析 介绍了 RecyclerView 的绘制流程,RecyclerView 通过将绘制流程从 View 中抽取出来,放到 Lay ...

  8. [微信小程序]字体文件,字体图标(.ttf,.woff,woff2)等无法显示问题

    一. 背景 项目引用了第三方UI框架Vant-weapp,但是前几天Vant的cdn被运营商封禁,导致van-icon无法使用. 有赞官方在Github上给出了在小程序app.wxss上添加以下代码的 ...

  9. 转 10 jmeter之动态关联

    10 jmeter之动态关联   jmeter中关联是通过之前请求的后置处理器实现的,具体有两种方式:XPath Extractor(一般xml的时候用的多)和正则表达式提取器. 以webtours登 ...

  10. windows激活密钥

    密钥来源,微软官方 KMS 客户端安装密钥 | Microsoft Docs Windows Server 2008 R2 操作系统版本 KMS 客户端安装程序密钥 Windows Server 20 ...