草儿家编号为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;
}