HDU 2066 一个人的旅行
2017-10-11 20:43
253 查看
题目链接
题目意思
给你T条路,现在小草要从S个与他相邻的城市出发,去D个目的地中的一个,要你求到达目的地的最短时间。解题思路
这就一道用dijkstra的最短路的题。这道题中的坑点就是小草到他相邻的城市的距离是0。用dijkstra跑一遍就出答案啦!代码部分
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> #include <queue> using namespace std; const int INF=99999; int map[1010][1010]; int dis[1010];///存储最短路 int vis[1010];///标记数组 int nex[1010];///记录与他相邻的城市 int ed[1010];///记录目的地 int t,s,d,n; int dijkstra() { int pos; memset(vis,0,sizeof(vis)); for(int i=0; i<=n; i++) dis[i]=map[0][i]; vis[0]=1; for(int i=1; i<=n; i++) { int min=INF; for(int j=1; j<=n; j++) { if(!vis[j]&&min>dis[j]) { min=dis[j]; pos=j; } } vis[pos]=1; for(int j=1; j<=n; j++) { if(!vis[j]&&dis[j]>map[pos][j]+dis[pos]) dis[j]=map[pos][j]+dis[pos]; } } } int main() { int a,b,tim,ans; while(scanf("%d%d%d",&t,&s,&d)!=EOF) { n=0; for(int i=0; i<1010; i++) for(int j=0; j<1010; j++) { map[i][j]=INF; map[i][i]=0; } while(t--) { scanf("%d%d%d",&a,&b,&tim); n=max(max(n,a),b); if(map[a][b]>tim) map[a][b]=map[b][a]=tim; } ans=INF; for(int i=0; i<s; i++) { scanf("%d",&nex[i]); map[0][nex[i]]=map[nex[i]][0]=0; } for(int i=0; i<d; i++) { scanf("%d",&ed[i]); } dijkstra(); for(int i=0; i<d; i++) { ans=min(ans,dis[ed[i]]); } printf("%d\n",ans); } return 0; }
相关文章推荐
- HDU 2066 一个人的旅行
- hdu 2066 一个人的旅行
- hdu 2066 一个人的旅行
- hdu 2066 一个人的旅行
- HDU 2066一个人的旅行(dijk最短路)
- HDU 2066 一个人的旅行(最短路)
- hdu 2066 一个人的旅行
- HDU 2066 一个人的旅行(Dijkstra)
- hdu-2066 一个人的旅行
- HDU 2066 一个人的旅行 <裸的迪杰斯特拉算法+虚拟顶点法>
- HDU 2066:一个人的旅行
- HDU 2066 一个人的旅行
- 一个人的旅行 hdu 2066
- HDU 2066 一个人的旅行(Dijkstra求特殊点的单源最短路径)
- hdu 2066 一个人的旅行(最短路问题)
- HDU 2066 一个人的旅行(spfa)
- hdu-2066 一个人的旅行
- HDU - 2066 - 一个人的旅行
- Hdu 2066 一个人的旅行(dijkstra算法,超级起点)
- HDOJ 2066 HDU 2066 一个人的旅行 ACM 2066 IN HDU