HDU - 2066 最短路+加一个节点
一个图上,有M条边,Z个出发点,Y个终止点。求一条最短路,其中起点是Z中的任意一点,终点是Y中任意一点。
Input
输入数据有多组,输入直到文件结束。
每组的第一行是三个整数M,Z,Y
接着有M行,每行有三个整数a,b,w,表示a,b之间存在一条长度为w的边 (1=<(a,b)<=1000,w原题干未给范围c++ int够用),可能存在重边,边为双向边。
接着的第M+1行有Z个数,表示起点标号
接着的第M+2行有Y个数,表示终点标号
Output
每组数据,输出一个整数占一行表示最短路的长度
Sample Input
6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10
Sample Output
9
代码(邻接矩阵):
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<queue>
6 #include<vector>
7 using namespace std;
8 const int maxn=1005;
9 typedef long long ll;
10 #define INF 0x3f3f3f3f
11 struct shudui1
12 {
13 ll start,value;
14 bool operator < (const shudui1 q)const
15 {
16 return value<q.value;
17 }
18 } str1;
19 struct shudui2
20 {
21 ll start,value;
22 } str2;
23 ll v1[maxn],v2[maxn],v[maxn],k[maxn][maxn];
24 priority_queue<shudui1>r;
25 void JK(ll maxx)
26 {
27 memset(v,INF,sizeof(v));
28 v[0]=0;
29 str1.start=0;
30 str1.value=0;
31 r.push(str1);
32 while(!r.empty())
33 {
34 ll x,y;
35 str1=r.top();
36 r.pop();
37 x=str1.start;
38 y=str1.value;
39 if(v[x]<y) continue;
40 //说明在这个点再此之后又入队了
41 //此次出队的并不是s到这个点的最短路,
42 //所以在这次更新前点v所连的点已经更过一次了
43 //所以后面也不会进行松弛操作
44 for(ll i=0; i<=maxx; ++i)
45 {
46 if((v[x]+k[x][i]<v[i]))
47 {
48 v[i]=v[x]+k[x][i];
49 str1.start=i;
50 str1.value=v[i];
51 r.push(str1);
52 }
53 }
54 }
55 }
56
57 int main()
58
59 {
60
61 ll n,m,p,a,b,c;
62
63 while(scanf("%lld %lld %lld",&n,&m,&p)!=EOF)
64
65 {
66
67 memset(k,INF,sizeof(k));
68
69 ll maxx=n;
70
71 for(ll i=1; i<=n; i++)
72
73 {
74
75 scanf("%lld %lld %lld",&a,&b,&c);
76
77 maxx=max(maxx,max(a,b)); //记录顶点上限
78
79 k[a][b]=min(c,k[a][b]); //保存最小边权
80
81 k[b][a]=min(c,k[a][b]);
82
83 }
84
85 for(ll i=0; i<m; i++)
86
87 {
88
89 scanf("%lld",&a);
90
91 k[a][0]=k[0][a]=0;
92
93 }
94
95 for(ll i=0; i<p; i++)
96
97 scanf("%lld",&v2[i]);
98
99 ll minn=INF;
100
101 JK(maxx);
102
103 for(ll j=0; j<p; j++) //找到最小路径
104
105 if(v[v2[j]]<minn)
106
107 minn=v[v2[j]];
108
109 printf("%lld\n",minn);
110
111 }
112
113 }
代码(邻接表)+注释:
1 /*
2 这道题首先不能暴力枚举起点和终点,所以floyd就不用再用了
3
4 我们只需要弄一个新节点(我代码中是maxx),让起点和新节点连一条边,边的距离为0,这样的话只需要跑一边迪杰斯特拉算法后,在v数组中枚举终点,取最小值就可以了
5
6 错了这么多次,才发现原来我是没有清空vector容器。。。
7 用邻接表存图是不用考虑有重边这个问题的
8
9 */
10 #include<stdio.h>
11 #include<string.h>
12 #include<iostream>
13 #include<algorithm>
14 #include<queue>
15 #include<vector>
16 using namespace std;
17 const int maxn=1005;
18 typedef long long ll;
19 #define INF 0x3f3f3f3f
20 struct shudui1
21 {
22 ll start,value;
23 bool operator < (const shudui1 q)const
24 {
25 return value<q.value;
26 }
27 } str1;
28 struct shudui2
29 {
30 ll start,value;
31 } str2;
32 ll v1[maxn],v2[maxn],v[maxn];
33 priority_queue<shudui1>r;
34 vector <shudui2>w[2005];
35 void JK(ll s)
36 {
37 memset(v,INF,sizeof(v));
38 v[s]=0;
39 str1.start=s;
40 str1.value=0;
41 r.push(str1);
42 while(!r.empty())
43 {
44 ll x,y;
45 str1=r.top();
46 r.pop();
47 x=str1.start;
48 y=str1.value;
49 if(v[x]<y) continue;
50 //说明在这个点再此之后又入队了
51 //此次出队的并不是s到这个点的最短路,
52 //所以在这次更新前点v所连的点已经更过一次了
53 //所以后面也不会进行松弛操作
54 ll len=w[x].size();
55 for(ll i=0; i<len; ++i)
56 {
57 str2=w[x][i];
58 if((v[x]+str2.value<v[str2.start]))
59 {
60 v[str2.start]=v[x]+str2.value;
61 str1.start=str2.start;
62 str1.value=v[str2.start];
63 r.push(str1);
64 }
65 }
66 }
67 }
68 int main()
69 {
70 ll a,z,y,d,f,g;
71 while(~scanf("%lld%lld%lld",&a,&z,&y))
72 {
73 ll maxx=0;
74 while(a--)
75 {
76 scanf("%lld%lld%lld",&d,&f,&g);
77 maxx=max(maxx,max(d,f));
78 str2.start=f;
79 str2.value=g;
80 w[d].push_back(str2);
81 str2.start=d;
82 str2.value=g;
83 w[f].push_back(str2);
84 }
85 maxx+=1;
86 for(ll i=1; i<=z; ++i)
87 {
88 scanf("%lld",&v1[i]);
89 str2.start=v1[i];
90 str2.value=0;
91 w[maxx].push_back(str2);
92 str2.start=maxx;
93 str2.value=0;
94 w[v1[i]].push_back(str2);
95 }
96
97 for(ll i=1; i<=y; ++i)
98 scanf("%lld",&v2[i]);
99 ll minn=INF;
100
101 JK(maxx);
102 for(ll j=1; j<=y; ++j)
103 {
104 minn=min(minn,v[v2[j]]);
105 }
106
107 printf("%lld\n",minn);
108 for(int i=1;i<=maxx;++i)
109 {
110 w[i].clear();
111 }
112 }
113 return 0;
114 }
HDU - 2066 最短路+加一个节点的更多相关文章
- hdu 2066 ( 最短路)  Floyd & Dijkstra & Spfa
		http://acm.hdu.edu.cn/showproblem.php?pid=2066 今天复习了一下最短路和最小生成树,发现居然闹了个大笑话-----我居然一直写的是Floyd,但我自己一直以 ... 
- HDU 2066  最短路floyd算法+优化
		http://acm.hdu.edu.cn/showproblem.php?pid=206 题意 从任意一个邻居家出发 到达任意一个终点的 最小距离 解析 求多源最短路 我想到的是Floyd算法 但是 ... 
- hdu 2066 最短路水题
		题意:给出多个可选择的起始点和终点,求最短路 思路:执行起始点次的spfa即可 代码: #include<iostream> #include<cstdio> #include ... 
- HDU 2196 Computer(求树上每一个节点到其他点的最远距离)
		解题思路: 求出树的直径的两个端点.则树上每一个节点到其它点的最远距离一定是到这两个端点的距离中最长的那一个. #include <iostream> #include <cstri ... 
- 删除链表的倒数第N个节点(头部加一个哑结点)
		我的代码:测试用例[1,2]2, 时会报错,无法不能删除第一个指针 /** * Definition for singly-linked list. * public class ListNode ... 
- hdu 2544最短路——最短路的初次总结 UESTC 6th Programming Contest Online
		这是一道标准的模板题,所以拿来作为这一段时间学习最短路的总结题目. 题意很简单: 有多组输入数据,每组的第一行为两个整数n, m.表示共有n个节点,m条边. 接下来有m行,每行三个整数a, b, c. ... 
- hdu 5521 最短路
		Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ... 
- # H - H HDU - 2066 (多起点、多终点问题)
		H - H HDU - 2066 (多源点.多汇点问题) 一个图上,有M条边,Z个出发点,Y个终止点.求一条最短路,其中起点是Z中的任意一点,终点是Y中任意一点. Input 输入数据有多组,输入直到 ... 
- ligerui_ligerTree_007_ligerTree动态加载节点
		ligerui:ligerTree:动态加载节点: 源码地址:http://download.csdn.net/detail/poiuy1991719/8571255 效果图: 代码:json.txt ... 
随机推荐
- 5.1中repair table
			mysql> repair table xs;+---------+--------+----------+----------+| Table | Op | Msg_type | Msg_te ... 
- 【Oracle】row_number() over(partition by )函数用法
			row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编 ... 
- kubectl命令管理
			kubectl命令管理 查看更多帮助命令 [root@k8s-master ~]# kubectl --help 创建一个命名空间 [root@k8s-master ~]# kubectl creat ... 
- 安装macosx10.13high serria
			本教程所需资源下载链接: 链接:https://pan.baidu.com/s/1wGTezXz6zGvtlwpv6mMoSg 提取码:r6n9 安装VMware workstation 16.0,安 ... 
- playwright自动化项目搭建
			这是关于playwright系列介绍的最后一篇.搭建基于 playwright 的自动化项目. GitHub地址: https://github.com/defnngj/playwright-pro ... 
- 开发中的你的Git提交规范吗?
			1. 前言 目前大部分公司都在使用Git作为版本控制,每个程序员每天都要进行代码的提交.很多开发者也包括我自己,有时候赶时间或者图省事,就这么提交: git commit -m "修改bug ... 
- 镍氢可充电电池2.4V转3.3V,2V转3.3V稳压供电输出电路图
			PW5100可以实现2.4V转3.3V,2V转3.3V的稳压电源电路,输出电流500MA.静态电流10uA,SOT23-5封装.输出纹波低,轻载性能高(轻载电感推荐6.8UH-10UH). PW510 ... 
- 转 jmeter测试手机号码归属地
			jmeter测试手机号码归属地 jmeter测试手机号码归属地接口时,HTTP请求有以下两种书写方法: 1.请求和参数一同写在路径中 2.参数单独写在参数列表中 请求方法既可以使用GET方法又可以 ... 
- JAVA高并发集合详解
			Queue(队列)主要是为了高并发准备的容器Deque:双端队列,可以反方向装或者取 最开始jdk1.0只有Vector和hashtable 默认所有方法都实现了synchronized锁,线程安全但 ... 
- js12种应该注意的地方
			1. == Javascript有两组相等运算符,一组是==和!=,另一组是===和!==.前者只比较值的相等,后者除了值以外,还比较类型是否相同. 请尽量不要使用前一组,永远只使用===和!==.因 ... 
