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 <string.h> #define INF 0x3f3f3f3f #define MAX_N 1005 int g[MAX_N][MAX_N]; int dist[MAX_N]; int used[MAX_N]; int t,s,d,n,min_n; int a,b,time; int x[MAX_N],y[MAX_N]; int max(int a,int b) { return a>b?a:b; } int min(int a,int b) { return a>b?b:a; } void add_edge(int a,int b,int time) { g[a][b] = g[b][a] = min(time,g[a][b]); //无向图中 避免(a->b->1 b->a->2)中第一次输入的权值小于第二次 , } //第二次输入权值却把第一次的权值覆盖掉 ,输出时2为错。 void init() { memset(used,0,sizeof(used)); memset(dist,INF,sizeof(dist)); } void Dijkstra() { init(); int i; for(i = 0; i<=n; i++) { dist[i] = g[0][i]; } while(1) { int u = -1,v,i; int min = INF; for(i=1;i<=n;i++) { if(dist[i]<min && !used[i]) { min = dist[i]; u = i; } } used[u] = 1; if(u==-1) { break; } for(v=1;v<=n;v++) { if(g[u][v]!=INF && dist[v]>dist[u]+g[u][v]) { dist[v] = dist[v] > dist[u]+g[u][v] ? dist[u]+g[u][v] : dist[v]; } } } } void _print() { int i,min_n = INF; for(i=0;i<d;i++) { min_n = min( min_n , dist[y[i]] ); } printf("%d\n",min_n); } int main() { while(scanf("%d%d%d",&t,&s,&d)!=EOF) { int i; n = 0; memset(g,INF,sizeof(g)); for(i=0;i<t;i++) { scanf("%d%d%d",&a,&b,&time); n = max(max(n,a),b); //记录最大的顶点个数 add_edge(a,b,time); } for(i=0;i<s;i++) { scanf("%d",&x[i]); g[0][x[i]] = g[x[i]][0] = 0; } for(i=0;i<d;i++) { scanf("%d",&y[i]); } Dijkstra(); _print(); } return 0; }