1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; int map[1111][1111]; int dis[1111]; int book[1111]; int maxn=1<<30; int main() { int t,s,d; while(cin>>t>>s>>d) { int minnn; for(int i=0;i<=1110;i++) for(int j=0;j<=1110;j++) if(i==j) map[i][j]=0; else map[i][j]=maxn; for(int i=1;i<=t;i++) { int a,b,c; cin>>a>>b>>c; map[a][b]=min(map[a][b],c); map[b][a]=map[a][b]; } for(int i=0;i<=1110;i++) book[i]=0; book[0]=1; for(int i=1;i<=s;i++) { int a; cin>>a; map[0][a]=map[a][0]=0; } for(int i=0;i<=1110;i++) { dis[i]=map[0][i]; } int u; for(int i=1;i<=1110;i++) { minnn=maxn; for(int j=1;j<=1110;j++) { if(book[j]==0&&dis[j]<minnn) { minnn=dis[j]; u=j; } } book[u]=1; for(int v=1;v<=1110;v++) { if(dis[v]>dis[u]+map[u][v]&&!book[v]) dis[v]=dis[u]+map[u][v]; } } int minn=maxn; for(int i=1;i<=d;i++) { int a; cin>>a; minn=min(dis[a],minn); } cout<<minn<<endl;} return 0; }
|