一个图上,有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 最短路+加一个节点的更多相关文章

  1. hdu 2066 ( 最短路) Floyd & Dijkstra & Spfa

    http://acm.hdu.edu.cn/showproblem.php?pid=2066 今天复习了一下最短路和最小生成树,发现居然闹了个大笑话-----我居然一直写的是Floyd,但我自己一直以 ...

  2. HDU 2066 最短路floyd算法+优化

    http://acm.hdu.edu.cn/showproblem.php?pid=206 题意 从任意一个邻居家出发 到达任意一个终点的 最小距离 解析 求多源最短路 我想到的是Floyd算法 但是 ...

  3. hdu 2066 最短路水题

    题意:给出多个可选择的起始点和终点,求最短路 思路:执行起始点次的spfa即可 代码: #include<iostream> #include<cstdio> #include ...

  4. HDU 2196 Computer(求树上每一个节点到其他点的最远距离)

    解题思路: 求出树的直径的两个端点.则树上每一个节点到其它点的最远距离一定是到这两个端点的距离中最长的那一个. #include <iostream> #include <cstri ...

  5. 删除链表的倒数第N个节点(头部加一个哑结点)

    我的代码:测试用例[1,2]2,  时会报错,无法不能删除第一个指针 /** * Definition for singly-linked list. * public class ListNode ...

  6. hdu 2544最短路——最短路的初次总结 UESTC 6th Programming Contest Online

    这是一道标准的模板题,所以拿来作为这一段时间学习最短路的总结题目. 题意很简单: 有多组输入数据,每组的第一行为两个整数n, m.表示共有n个节点,m条边. 接下来有m行,每行三个整数a, b, c. ...

  7. hdu 5521 最短路

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  8. # H - H HDU - 2066 (多起点、多终点问题)

    H - H HDU - 2066 (多源点.多汇点问题) 一个图上,有M条边,Z个出发点,Y个终止点.求一条最短路,其中起点是Z中的任意一点,终点是Y中任意一点. Input 输入数据有多组,输入直到 ...

  9. ligerui_ligerTree_007_ligerTree动态加载节点

    ligerui:ligerTree:动态加载节点: 源码地址:http://download.csdn.net/detail/poiuy1991719/8571255 效果图: 代码:json.txt ...

随机推荐

  1. 通用寄存器_MOV_ADD_SUB_AND_OR_NOT

    通用寄存器 MOV指令 注意:目标操作数与操作数宽度必须一样 MOV 目标操作数,源操作数 作用:拷贝源操作数到目标操作数 1.源操作数可以是立即数.通用寄存器.段寄存器.或者内存单元. 2.目标操作 ...

  2. online创建索引中途取消导致索引无法删除解决办法

    问题:有一个表ID栏位没有索引,但是在一个update语句的where中被使用,因此打算online创建索引,但是长时间没有成功,此时决定取消,取消后发现索引无法删除 过程: 数据库监控报警有行锁,进 ...

  3. DOI技术扫盲一

    DOI:  desktop office intergration   桌面办公软件集成简单的将,就是我们在Windows桌面中打开的办公软件(如:word,excel,pdf等等)可以在SAP系统进 ...

  4. php压缩文件夹并下载到本地

    /** * @param $path 要压缩的文件夹路径 * @param $filename 要生成的压缩包名称 */ public function create_zip($path,$filen ...

  5. web框架的本质:

    简单的web框架 web的应用本质其实就是socket服务器,用户所使用的浏览器就是一个cocket客户端,客户使用浏览器发送的请求会被服务接收,服务器会按照http协议的响应协议来回复请求,这样的网 ...

  6. uni-app开发经验分享三: Vuex实现登录和用户信息留存

    在做用户登录的过程中,其实最重要的是登录成功后的数据要怎么储存,储存到哪里,这里我分享一个利用vuex来实现用户登录和用户数据留存的方法 vuex代码如下: //引入vue和vuex import V ...

  7. CMU数据库(15-445)-实验2-B+树索引实现(中)删除

    3. Delete 实现 附上实验2的第一部分 https://www.cnblogs.com/JayL-zxl/p/14324297.html 3. 1 删除算法原理 如果叶子结点中没有相应的key ...

  8. rbd-db数据迁移至外部数据库

    部署外部数据库 安装Docker export VERSION=19.03 && curl -fsSL http://rainbond-pkg.oss-cn-shanghai.aliy ...

  9. Ubuntu 能ping通DNS 地址 无法解析域名

    ping通qq百度都行,唯独谷歌不行, 主机能够ping通google的dns服务器地址 8.8.8.8,却无法解析域名   $ ping www.google.co.uk ping: unknown ...

  10. jquery 数据查询

    jquery 数据查询 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...