Choose the best route
http://acm.hdu.edu.cn/diy/contest_showproblem.php?cid=12497&pid=1011
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 9 Accepted Submission(s) : 3
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Input
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.
Output
Sample Input
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
Sample Output
1 -1
Author
Source
#include<iostream>
using namespace std;
const int maxnum=1005;
const int maxint=9999999;
int dist[maxnum];
int map[maxnum][maxnum];
bool s[maxnum];
int n,m,t; //分别是车站数,道路数,始点
void init(){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=maxint;
}
void Dijkstra(int v){
for(int i=1;i<=n;i++){
dist[i]=map[v][i];
s[i]=0;
}
s[v]=1;
dist[v]=0;
for(int i=2;i<=n;i++){
int temp=maxint;
int u=v;
for(int j=1;j<=n;j++)
if((!s[j]) && dist[j]<temp){
temp=dist[j];
u=j;
}
s[u]=1;
for(int j=1;j<=n;j++)
if((!s[j]) && dist[u]+map[u][j]<dist[j])
dist[j]=dist[u]+map[u][j];
}
}
int main(){
int a,b,d;
while(scanf("%d%d%d",&n,&m,&t)!=EOF){
init();
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&d); //注意这里是从b 到 a
if(d<map[b][a])
map[b][a]=d; //注意这里是有向图
}
Dijkstra(t);
int w,min=maxint,x;
scanf("%d",&w);
for(int i=1;i<=w;i++){
scanf("%d",&x);
if(dist[x]<min)
min=dist[x];
}
if(min<maxint)
printf("%d\n",min);
else
printf("-1\n");
}
return 0;
}