hdu 2066(一个人的旅行)
2013-04-24 15:49
323 查看
题目要求可以有多个起点,多个终点。
那么,再设一个虚拟起点,它到所有起点的花费为0。然后,就是熟悉的单源最短路径了。
最后,输出终点最短的路径。
那么,再设一个虚拟起点,它到所有起点的花费为0。然后,就是熟悉的单源最短路径了。
最后,输出终点最短的路径。
#include<iostream> #include<cstring> using namespace std; #define MAX 65534 int g[1010][1010]; int dist[1010]; int vis[1010]; int main() { // freopen("in.txt","r",stdin); int t,s,d; while(scanf("%d %d %d",&t,&s,&d)==3) { for(int i=0;i<1010;i++) for(int j=0;j<1010;j++) g[i][j]=MAX; int maxd=0; int a,b,c; for(int i=0;i<t;i++) { scanf("%d %d %d",&a,&b,&c); if(c<g[a][b]) g[a][b]=g[b][a]=c; if(a>maxd) maxd=a; if(b>maxd) maxd=b; } for(int i=1;i<=maxd;i++) dist[i]=MAX; for(int i=0;i<s;i++) { scanf("%d",&a); dist[a]=0; } memset(vis,0,sizeof(vis)); for(int i=s+1;i<=maxd;i++) { int p,tmp=MAX; for(int j=1;j<=maxd;j++) if(!vis[j]&&dist[j]<tmp) { tmp=dist[j]; p=j; } vis[p]=1; for(int j=1;j<=maxd;j++) if(!vis[j]&&dist[j]>dist[p]+g[p][j]) dist[j]=dist[p]+g[p][j]; } int mind=65535; for(int i=0;i<d;i++) { scanf("%d",&a); if(mind>dist[a]) mind=dist[a]; } printf("%d\n",mind); } return 0; }
相关文章推荐
- HDU 2066 一个人的旅行 超级源点
- HDU 2066 一个人的旅行 spfa
- hdu 2066 一个人的旅行(迪杰斯特拉 && floyd)
- HDU 2066 一个人的旅行 (floyd)
- hdu-2066 一个人的旅行
- HDU 2066 一个人的旅行 <裸的迪杰斯特拉算法+虚拟顶点法>
- hdu 2066 一个人的旅行
- HDU 2066 一个人的旅行(最短路径)
- HDU 2066 一个人的旅行(单源最短路SPFA)
- hdu 2066 一个人的旅行(最短路问题)
- hdu 2066 一个人的旅行
- hdu 2066 一个人的旅行
- HDU 2066 一个人的旅行【Dijkstra 】
- hdu 2066 一个人的旅行
- hdu 2066 一个人的旅行
- hdu 2066 一个人的旅行
- 一个人的旅行 hdu 2066
- HDU 2066-一个人的旅行(最短路Dijkstra)
- HDU 2066 一个人的旅行(spfa)
- HDU - 2066 一个人的旅行(dijkstra最短路)