标签:
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
9代码:#include<stdio.h> #include<algorithm> #include<string.h> #define INF 0x3f3f3f using namespace std; int map[1010][1010],low[1010],vis[1010]; int lin,want; int t,s,d,n; int init() { for(int i=0;i<=1000;i++) { for(int j=0;j<=1000;j++) { if(i==j) map[i][j]=0; else map[i][j]=INF; } } } int dijkstra(int x) { int i,j,min,next; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) { low[i]=map[x][i]; } vis[x]=1; for(i=1;i<=n;i++) { min=INF; for(j=1;j<=n;j++) { if(!vis[j]&&min>low[j]) { min=low[j]; next=j; } } vis[next]=1; if(min==INF)//遇到不通的路时跳出; { break; } for(j=1;j<=n;j++) { if(!vis[j]&&low[j]>low[next]+map[next][j]) { low[j]=low[next]+map[next][j]; } } } } int main() { int i,j,time,a,b,c; while(scanf("%d%d%d",&t,&s,&d)!=EOF) { time=INF;n=0; init(); for(i=0;i<t;i++) { scanf("%d%d%d",&a,&b,&c); if(map[a][b]>0) map[a][b]=map[b][a]=map[a][b]<c?map[a][b]:c;//选择两个城市间花费时间最小的道路; n=max(max(a,b),n);//找到编号最大的城市; } for(i=0;i<s;i++) { scanf("%d",&lin);//输入临近的城市; map[0][lin]=0;//设这个城市与0号城市的距离为0; } dijkstra(0);//以0为起点找最短路径; for(i=0;i<d;i++) { scanf("%d",&want); time=min(time,low[want]);//找出所有想去的城市中用时最短的时间; } printf("%d\n",time); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/longge33445/article/details/47732303