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
假设从0开始出发,
到草儿相邻的城市时间为0;
转化为从一个点到其他点的问题
#include <stdio.h> const int INF=0xfffffff; int dist[1005]; //到每个点的距离 int a[1005][1005]; //领接矩阵 int n; void init() { for(int i=0;i<=1000;i++) for(int j=0;j<=1000;j++) a[i][j]=(i==j?0:INF); } void dijkstra(int u) { int sign[1005]={0}; int x=u; int i,j; for(i=0;i<=n;i++) //第一步初始化 dist[i]=a[x][i]; dist[x]=0; sign[x]=1; for(i=0;i<=n-2;i++) //找最小 { int min=INF; for(j=0;j<=n;j++) { if(!sign[j] && min>dist[j]) { min=dist[j]; x=j; } } sign[x]=1; for(j=0;j<=n;j++) //第二步初始化 { if(!sign[j] && a[x][j]<INF && dist[x]+a[x][j]<dist[j]) dist[j]=dist[x]+a[x][j]; } } } int fmin(int a,int b) { return a>b?b:a; } int fmax(int a,int b) { return a>b?a:b; } int main() { int t,s,d; int i; while(scanf("%d %d %d",&t,&s,&d)!=EOF) { init(); n=0; for(i=1;i<=t;i++) { int x,y,z; scanf("%d %d %d",&x,&y,&z); a[x][y]=fmin(a[x][y],z);//考虑重边
a[y][x]=fmin(a[y][x],z);//考虑重边 n=fmax(n,x); //n的值不确定, n=fmax(n,y); //取输入的最大城市值。 } for(i=1;i<=s;i++) { int x; scanf("%d",&x); a[0][x]=0; //到相邻城市距离为0 a[x][0]=0; } dijkstra(0); int min=INF,k; for(i=1;i<=d;i++) { scanf("%d",&k); min=fmin(min,dist[k]); } printf("%d\n",min); } return 0; }
关于改组测试数据,dist值变化如下:
dist【0~n】