Choose the best route
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1788 Accepted Submission(s): 550
Each case begins with three integers n, m and s,(n<1000,m<20000,1=<s<=n) n stands for the number of bus stations in this city and m stands for the number of directed ways between bus stations .(Maybe there are several ways between two bus stations .) s stands for the bus station that near Kiki’s friend’s home.
Then follow m lines ,each line contains three integers p , q , t (0<t<=1000). means from station p to station q there is a way and it will costs t minutes .
Then a line with an integer w(0<w<n), means the number of stations Kiki can take at the beginning. Then follows w integers stands for these stations.
5 8 5 1 2 2 1 5 3 1 3 4 2 4 7 2 5 6 2 3 5 3 5 1 4 5 1 2 2 3 4 3 4 1 2 3 1 3 4 2 3 2 1 1
1 -1
#define M 100000000
int map[1009][1009],dist[1009],s[1009],n,r;
int Dij(int v)
{
int i,j,dir,min;
for(i=1;i<=n;i++)
{
s[i]=0;
dist[i]=map[v][i];
}
s[v]=1;
dist[v]=0;
for(i=1;i<=n;i++)
{
min=M;
for(j=1;j<=n;j++)
if(s[j]==0&&dist[j]<min)
{
dir=j;
min=dist[j];
}
if(min==M)break;
s[dir]=1;
for(j=1;j<=n;j++)
if(s[j]==0&&dist[j]>dist[dir]+map[dir][j])
dist[j]=dist[dir]+map[dir][j];
}
return dist[r];
}
int main()
{
int i,j,p,q,t,a,b,m,w;
while(scanf("%d%d%d",&n,&m,&r)!=EOF)
{
for(i=0;i<1009;i++)
for(j=0;j<1009;j++)
map[i][j]=M;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&p,&q,&t);
if(map[p][q]>t)//因为他是去朋友家,单向!
map[p][q]=t;
}
scanf("%d",&w);
for(i=0;i<w;i++)
{
scanf("%d",&a);
map[0][a]=0;//从0到最近点也为0不然超时
}
b=Dij(0);//起始点从0
if(b!=M)
printf("%d\n",b);
else
printf("-1\n");
}
return 0;
}