草儿家编号为0,与相邻的城市车程设为0,一次dij即可
#include <iostream> #include <memory.h> using namespace std; #define Max_V 1005 const int IN = (1<<28); int T,S,D; int G[Max_V+1][Max_V+1]; int des[Max_V+1]; int dist[Max_V+1]; int visited[Max_V+1]; void dij() { for( int i = 0; i <= Max_V; i++ ) dist[i] = G[0][i]; dist[0] = 0; visited[0] = 1; while(1) { int MinV = 0, Min = IN; for( int i = 1; i <= Max_V; i++ ) { if( !visited[i] && dist[i] < Min ) { Min = dist[i]; MinV = i; } } if( !MinV ) break; else { visited[MinV] = 1; for( int i = 1; i <= Max_V; i++ ) { if( !visited[i] && dist[i] > dist[MinV] + G[MinV][i] ) { dist[i] = dist[MinV] + G[MinV][i]; } } } } } int main() { while( cin >> T >> S >> D ) { memset(visited, 0, sizeof(visited)); memset(dist, 0, sizeof(dist)); memset(G, 0, sizeof(G)); memset(des, 0, sizeof(des)); for( int i = 0; i <= Max_V; i++ ) for( int j = 0; j <= Max_V; j++ ) { if( i==j ) G[i][j] = 0; else G[i][j] = IN; } while( T-- ) { int Begin,End,Length; cin >> Begin >> End >> Length; if( G[Begin][End] > Length ) { G[Begin][End] = Length; G[End][Begin] = Length; } } while( S-- ) { int station; cin >> station; G[0][station] = 0; G[station][0] = 0; } for( int i = 1; i <= D; i++ ) cin >> des[i]; dij(); int MinTime = IN; for( int i = 1; i <= D; i++ ) { MinTime = min( dist[des[i]], MinTime); } cout << MinTime << endl; } return 0; }