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 }