hdu 2680 Choose the best route
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=2680
一直在纠结时间相等时入队列的先后问题,突然发现自己二呀,路径相等的都会依次入队啊~~~
好了,说正事,最短路问题,用Dijkstra,注意几个地方:
1.这个问题可以倒过来想,从终点到这几个点中的最短距离。
2.路是有向的,如果倒过来想问题,那么路的方向也要倒过来。
eg: 输入1 2 5即从1到2的时间是5,那么如果倒过来考虑(以她朋友的家为起点),就要记录w[2][1]=5;
源代码:
1 #include <iostream> 2 #include<queue> 3 #include<stdio.h> 4 #include<cstring> 5 using namespace std; 6 const int INF=100000000; 7 int visit[1005],w[1005][1005],d[1005]; 8 int main() 9 { 10 int n,m,s,ok,re,i,j,p,q,t,e; 11 while(scanf("%d %d %d",&n,&m,&s)!=EOF){ 12 memset(visit,0,sizeof(visit)); 13 for(i=1;i<=n;i++) 14 for(j=1;j<=n;j++){ 15 w[i][j]=INF; 16 d[i]=(i==s?0:INF); 17 } 18 for(i=1;i<=m;i++){ 19 scanf("%d %d %d",&p,&q,&t); 20 if(w[q][p]>t) w[q][p]=t; 21 } 22 queue<int>que; 23 que.push(s); 24 visit[s]=1; 25 while(!que.empty()){ 26 int min=INF; 27 ok=0; 28 int temp=que.front(); 29 que.pop(); 30 for(i=1;i<=n;i++){ 31 if(visit[i]==0&&i!=temp){ 32 if(d[i]>d[temp]+w[temp][i]){ 33 d[i]=d[temp]+w[temp][i]; 34 } 35 if(d[i]<min){ 36 ok=1; 37 re=i; 38 min=d[i]; 39 } 40 } 41 } 42 if(ok==1){ 43 que.push(re); 44 visit[re]=1; 45 } 46 } 47 int ans=INF; 48 int choice; 49 scanf("%d",&choice); 50 for(i=1;i<=choice;i++){ 51 scanf("%d",&e); 52 if(d[e]<ans) ans=d[e]; 53 } 54 if(ans==INF) printf("-1\n"); 55 else printf("%d\n",ans); 56 57 } 58 return 0; 59 }