一个图上,有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. 【JS学习】数组过滤方法的使用filter

    前言:本博客系列为学习后盾人js教程过程中的记录与产出,如果对你有帮助,欢迎关注,点赞,分享.不足之处也欢迎指正,作者会积极思考与改正. 使用效果: 可以返回参数函数为真的值 //情景:实现从stu数 ...

  2. 【Spring】Spring中的Bean - 5、Bean的装配方式(XML、注解(Annotation)、自动装配)

    Bean的装配方式 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 文章目录 Bean的装配方式 基于XML的装配 基于注解 ...

  3. 【Linux】make编译的小技巧

    ------------------------------------------------------------------------------------------------- | ...

  4. 【Linux】vim关闭终端的时候,忘记退出vim怎么办

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

  5. Oracle备份审计表SYS.AUD$和SYS.FGA_LOG$

    ORACLE的审计表不可以使用expdp和impdp导出和导入,如果使用,会报如下错误: 需要使用exp和imp进行导出和导出 导出语句: exp " '/ as sysdba' " ...

  6. 宝塔的url计划任务

    to通过url访问 就像访问你的网站一样 然后控制器/方法里面写你要做的操作 就可以了 ,简单的一批

  7. Pytorch入门——手把手教你MNIST手写数字识别

    MNIST手写数字识别教程 要开始带组内的小朋友了,特意出一个Pytorch教程来指导一下 [!] 这里是实战教程,默认读者已经学会了部分深度学习原理,若有不懂的地方可以先停下来查查资料 目录 MNI ...

  8. innodb引擎的4大特性

    一:插入缓冲 二:二次写 三:自适应哈希 四:预读 1.插入缓冲(insert buffer)插入缓冲(Insert Buffer/Change Buffer):提升插入性能,change buffe ...

  9. Docker数据目录迁移解决方案

    场景 在docker的使用中随着下载镜像越来越多,构建镜像.运行容器越来越多, 数据目录必然会逐渐增大:当所有docker镜像.容器对磁盘的使用达到上限时,就需要对数据目录进行迁移. 如何避免: 1. ...

  10. XShell的手动直连,避免配置ssh免密的一些问题