我啊,自作聪明用dij先最短路,然后用bellman的判断负环判断 = =。。。结果WA得很惨。
后来改成bellman-ford,党的那种 = =。。
if( ( dis[x] - comm) * rate > dis[y] + 1e-5 ) 写成了if( ( dis[x] - comm) * rate > dis[y] ) 居然TLE了 = =。。找了半天错。无语了都。为什么捏。待考证 = =。
/*下面的想法是错误的。
在poj上表示完全无影响,要不要1e-5都能过。zoj上,从1e-5到1e-14都能AC,而且是0ms。到1e-15就TLE了。
应该是这样的,比如加了1e-5,加了这个判断就是比较到小数位后5位就停止了,不用比较后来的位数。如果直接用>的话,就会把小数后所有的位数比较一遍,意义不大还耗费时间。
这个被GB否定了 T T.。。。*/
double精度在15-16位,大小在1.7E-308~1.7E+308,如果esp == 1e-15,则比较的结果不准呢。这个应该是造成TLE的问题吧。可能一直比较,得不到要的结果。。。
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> #include <math.h> #define eps 1e-5 #define SIZE 110 using namespace std; int N,S,M; double V; typedef struct node { int x,y; double rate,comm; }node; node arr[SIZE*SIZE]; int cou; int Bellman() { double dis[SIZE]; for(int i=1; i<=N; i++) dis[i] = -1.0; dis[S] = V; while(1) { int flag = 0; for(int k=0; k<cou; k++) { int x = arr[k].x; if( dis[x] < eps ) continue; int y = arr[k].y; double comm = arr[k].comm; double rate = arr[k].rate; if( (dis[x] - comm) * rate - dis[y] > eps ) { dis[y] = (dis[x] - comm) * rate; flag = 1; } } if( dis[S] > V ) return 1; if( !flag ) break; } return 0; } int main() { int x,y; while( scanf("%d %d %d %lf",&N,&M,&S,&V) != EOF ) { cou = 0; for(int i=0; i<M; i++) { scanf("%d %d",&x,&y); arr[cou].x = x; arr[cou].y = y; scanf("%lf %lf", &arr[cou].rate, &arr[cou].comm); cou++; arr[cou].x = y; arr[cou].y = x; scanf("%lf %lf", &arr[cou].rate, &arr[cou].comm); cou++; } if( Bellman() ) printf("YES/n"); else printf("NO/n"); } return 0; }