hdu 2066 一个人的旅行(Dijkstra)
2017-10-09 21:16
441 查看
http://acm.split.hdu.edu.cn/showproblem.php?pid=2066
注意建图的方法:把0看做一个大的源点,直接相连的权值为0
最后计算从0到各个点的最短路的最小的那个值即可。
注意建图的方法:把0看做一个大的源点,直接相连的权值为0
最后计算从0到各个点的最短路的最小的那个值即可。
#include<iostream> #include<cstring> #define INF 0x3f3f3f3f using namespace std; const int maxn=1005; int n,e[maxn],d[maxn],g[maxn][maxn],vis[maxn]; void Dijkstra() { for(int i=0;i<=n;i++) d[i]=g[0][i]; memset(vis,0,sizeof(vis)); vis[0]=1; for(int i=1;i<=n;i++) { int mind=INF,mark; for(int j=1;j<=n;j++) if(!vis[j]&&d[j]<mind) mind=d[mark=j]; vis[mark]=1; for(int j=1;j<=n;j++) if(!vis[j]) d[j]=min(d[j],d[mark]+g[mark][j]); } } int main() { int m,a,b,u,v,w,x; while(cin>>m>>a>>b) { memset(g,INF,sizeof(g)); for(int i=0;i<1001;i++) g[i][i]=0; while(m--) { cin>>u>>v>>w; n=max(max(n,u),v); //找出最大的那个点 if(g[u][v]>w) g[u][v]=g[v][u]=w; } int minn=INF; while(a--) { cin>>x; g[0][x]=g[x][0]=0; //0为超级源点 到与它相邻的点的距离都为0 } for(int i=0;i<b;i++) cin>>e[i]; Dijkstra(); //计算出从0(源点)到各个点的最短路 for(int i=0;i<b;i++) minn=min(minn,d[e[i]]); //遍历找出最小的最短距离 cout<<minn<<endl; } return 0; }
相关文章推荐
- (阶段三 dijkstra算法温习1.2)HDU 2066 一个人的旅行(使用dijkstra来解决多源起点和多源终点的最短路径问题)
- 一个人的旅行(http://acm.hdu.edu.cn/showproblem.php?pid=2066)SPFA||dijkstra
- 【HDU - 2066 一个人的旅行】 最短路 dijkstra,spfa
- hdu 2066 一个人的旅行(dijkstra 多个起点和终点)
- HDU 2066--一个人的旅行【Dijkstra】
- HDU2066 一个人的旅行【Dijkstra】
- HDU 2066-一个人的旅行(Dijkstra)
- 【hdu 2066】 一个人的旅行 ( 最短路 Dijkstra)
- hdu 2066 一个人的旅行【Dijkstra 12级新生训练—图论E】
- HDU 2066-一个人的旅行(最短路Dijkstra)
- hdu 2066 一个人的旅行 Dijkstra+优先队列优化
- HDU - 2066 一个人的旅行 (Dijkstra)
- hdu 2066 一个人的旅行【Dijkstra 12级新生训练—图论E】
- HDU2066_一个人的旅行(Dijkstra最短路)
- HDU 2066 一个人的旅行【Dijkstra 】
- HDU 2066 一个人的旅行(Dijkstra,建图很巧妙)
- HDU 2066 一个人的旅行(最短路&Dijkstra)
- hdu 2066 一个人的旅行(dijkstra)
- hdu 2066 一个人的旅行 Dijkstra
- hdu 2066 一个人的旅行(简单的Dijkstra)