标签:
3 1 0.5 0.5 0.5 1 0.4 0.5 0.4 1 3 1 2 2 3 1 3
0.500 0.400 0.500
解析:按照题意Floyd的时间复杂度是O(n^3),是过不了的。网上可能有些人品比较好的大神用C++4000多ms水过了,但是其实是在误导。代码要写就在严格题目要求的范围内去考虑,否则只会投机取巧。最开始想的时候,看到有多组起始点,立马想到了Floyd,但是结果却是无尽TLE。。。由于n<=1000,所以我们不该使用Floyd,用Q次Dijkstra即可。不过我们要求的是最大路径!!!
PS:用到了double,一定要注意精度!!!还有double不能直接判相等!!!
AC代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; #define INF 1e4 + 2 int n; double w[1002][1002], d[1002]; int v[1002]; void dijkstra(int s){ memset(v, 0, sizeof(v)); for(int i=1; i<=n; i++) d[i] = (i==s ? 1 : 0); //无穷小为0 for(int i=1; i<=n; i++){ int x; double m = -INF; //找最大值 for(int y=1; y<=n; y++) if(!v[y] && d[y] > m) m = d[x = y]; v[x] = 1; for(int y=1; y<=n; y++) d[y] = max(d[y], d[x] * w[x][y]); //max } } int main(){ #ifdef sxk freopen("in.txt", "r", stdin); #endif // sxk int s, e, m; while(~scanf("%d", &n)){ for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) scanf("%lf", &w[i][j]); scanf("%d", &m); while(m--){ scanf("%d%d", &s, &e); dijkstra(s); if(d[e] >= 0.0000001) printf("%.3lf\n", d[e]); //精度,double不能直接判相等!!! else puts("What a pity!"); } } return 0; }
hdu 1596 find the safest road (Dijksrta算法)
标签:
原文地址:http://blog.csdn.net/u013446688/article/details/42983533