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 }

 

posted @ 2013-08-07 16:06  小の泽  阅读(190)  评论(0编辑  收藏  举报