接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
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
代码如下;
#include<stdio.h>
#include<string.h>
#include<iostream>
#define INFINITE 1005;
using namespace std;
int s[1020][1020],in[1020],len[1020],end_[1020];
int main()
{
int T,S,D,i,j,A,B,C,top,count,tempmin,si,min;
while(cin>>T>>S>>D)
{
for(i=0;i<1020;i++)
for(j=0;j<1020;j++)
{
if(i==j)
s[i][j]=0;
else
s[i][j]=INFINITE;
}
count=0;si=0;top=0;
for(i=0;i<T;i++)
{
cin>>A>>B>>C;
if(C<s[A][B])
{
s[A][B]=C;
s[B][A]=C;
}
if(A>top)
top=A;
if(B>top)
top=B;
}
for(i=0;i<S;i++)
{
cin>>A;
s[0][A]=0;
s[A][0]=0;
if(A>top)
top=A;
}
for(i=0;i<D;i++)
{
cin>>end_[i];
if(end_[i]>top)
top=end_[i];
}
for(i=0;i<=top;i++)
{
in[i]=0;
len[i]=INFINITE;
}
len[0]=1;
for(i=1;i<=top;i++)
len[i]=s[0][i];
while(count<top-1)
{
tempmin=INFINITE;
for(i=1;i<=top;i++)
{
if(in[i]==0&&len[i]<tempmin)
{
tempmin=len[i];
si=i;
}
}
in[si]=1;
for(i=1;i<=top;i++)
{
if(in[i]==0&&(tempmin+s[si][i]<len[i]))
{
len[i]=tempmin+s[si][i];
}
}
count++;
}
min=len[end_[0]];
for(i=1;i<D;i++)
{
if(len[end_[i]]<min)
min=len[end_[i]];
}
cout<<min<<endl;
}
return 0;
}