Choose the best route
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5249 Accepted Submission(s): 1669
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.
#include<iostream>
#define inf 0xffff
using namespace std;
int map[1011][1011];
int mark[1011];
int dis[1011];
int n,m,s;
int Dijkstra()
{
int i,j;
for(i=0;i<=n;i++)
{
dis[i]=map[0][i];
mark[i]=0;
}
dis[0]=0;
mark[0]=1;
for(i=0;i<n;i++)
{
int mimi=inf;
int pos=0;
for(j=0;j<=n;j++)
{
if(mimi>dis[j]&&mark[j]==0)
{
pos=j;
mimi=dis[j];
}
}
if(mimi==inf) break;
mark[pos]=1;
for(j=0;j<=n;j++)
{
if((dis[j]>(dis[pos]+map[pos][j]))&&mark[j]==0)
dis[j]=dis[pos]+map[pos][j];
}
}
if(dis[s]==inf) return -1;
else
return dis[s];
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&s))
{
int i,j,k;
for(i=0;i<1011;i++)
{
for(j=0;j<1011;j++)
map[i][j]=inf;
}
for(i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c)
map[a][b]=c;
}
int t,bb;
scanf("%d",&t);
for(i=0;i<t;i++)
{
scanf("%d",&bb);
map[0][bb]=map[bb][0]=0;
}
printf("%d\n",Dijkstra());
}
return 0;
}