Choose the best route
InputThere are several test cases.
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.
OutputThe output contains one line for each data set : the least time Kiki needs to spend ,if it’s impossible to find such a route ,just output “-1”.
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
主要思路:多个起点求最短路径,可以设置一个源点,使得该点到所有起点的长度为0,题目即转化为从一个起点到一个终点的最短路径。(注意,该题用cin读入数据可能会超时,建议用scanf)
#include<iostream> #include<cstring> #define INF 99999999 using namespace std; int dis[1005],visit[1005],e[1005][1005]; int n,m,s; void dijkstra() { int i,j; memset(visit,0,sizeof(visit)); for (i=1;i<=n;i++) dis[i]=e[0][i]; visit[0]=1;dis[0]=0; for (i=0;i<=n;i++) { int pos=-1,mindis=INF; for (j=0;j<=n;j++) if (visit[j]==0&&mindis>dis[j]) { pos=j; mindis=dis[j]; } if (pos==-1) break; visit[pos]=1; for (j=1;j<=n;j++) if (visit[j]==0&&dis[j]>dis[pos]+e[pos][j]) dis[j]=dis[pos]+e[pos][j]; } } int main() { int p,q,t,i,j,w; while (scanf("%d%d%d",&n,&m,&s)!=EOF) { for (i=0;i<1005;i++) { for (j=0;j<1005;j++) e[i][j]=INF; e[i][i]=0; } while (m--) { scanf("%d%d%d",&p,&q,&t); if (t<e[p][q]) e[p][q]=t; } scanf("%d",&w); while (w--) { scanf("%d",&t); e[0][t]=0; } dijkstra(); if (dis[s]>=INF) cout<<"-1\n"; else cout<<dis[s]<<endl; } return 0; }