HDU 1596 find the safest road 最短路

解题报告:求两个点之间的最安全的路线的安全值是多少。

就是一个最短路的题,要注意的是这题用弗洛伊德过不了,一定要用地杰斯特拉,但是我还有一个不懂的地方,为什么按照我的做法,如果不把每次走过的点标记掉的话,总会选到重复的点,而且如果只标记上一次走过的和起点不重复走的话,还是TLE,求大神。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 int n,Q,visit[1003];
 6 double map[1003][1003],L[1003];
 7 double Djstra(int n,int s,int e) {
 8     memset(visit,0,sizeof(visit));   //前面没有标记走过的点,不知道为什么总会走重复的点,TLE多次 
 9     visit[s] = 1;
10     memset(L,0,sizeof(L));
11     L[s] = 1;
12     L[0] = -1;
13     while(s != e) {
14         for(int i  = 1;i<=n;++i)
15         L[i] = max(L[i],L[s]*map[s][i]);
16         visit[s] = 1;
17         s = 0;
18         for(int i = 1;i<=n;++i)
19         if(L[i] > L[s] && visit[i]==0)
20         s = i;
21         if(s == 0)
22         break;
23     }
24     return L[e];
25 }
26 
27 int main() {
28     int x,y;
29     while(scanf("%d",&n)!=EOF) {
30         for(int i = 1;i<=n;++i)
31         for(int j = 1;j<=n;++j)
32         scanf("%lf",&map[i][j]);
33         scanf("%d",&Q);
34         while(Q--) {
35             scanf("%d%d",&x,&y);
36             double ans = Djstra(n,x,y);
37             printf(ans? "%.3lf\n":"What a pity!\n",ans);
38         }
39     }
40     return 0;
41 }
View Code

 

posted @ 2013-08-14 23:16  xiaxiaosheng  阅读(243)  评论(0编辑  收藏  举报