又是一个变量敲错,错了10次,这是搞毛线啊。。。对spfa不熟,一直以为模版敲错了。。。终于,在大家的帮助下找到那个sb错误,从下午一直搞到晚上。。。这个题还是很经典的,有向图里,找每一个点到x的最小环。先正向建图再反向建图,两遍spfa。
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <queue> 5 using namespace std; 6 #define N 2000000 7 int p1[1011][1011],p2[1011][1011]; 8 int d1[10011],d2[10011],in1[10011],in2[10011]; 9 int main() 10 { 11 int i,j,n,m,x,sv,ev,w,str,ans; 12 queue<int> que1,que2; 13 scanf("%d%d%d",&n,&m,&x); 14 for(i = 1; i <= n; i ++) 15 { 16 for(j = 1; j <= n; j ++) 17 p1[i][j] = p2[i][j] = N; 18 p1[i][i] = p2[i][i] = 0; 19 } 20 for(i = 1; i <= m; i ++) 21 { 22 scanf("%d%d%d",&sv,&ev,&w); 23 if(p1[sv][ev] > w) 24 p1[sv][ev] = w; 25 if(p2[ev][sv] > w) 26 p2[ev][sv] = w; 27 } 28 for(i = 1; i <= n; i ++) 29 d1[i] = d2[i] = N; 30 que1.push(x); 31 que2.push(x); 32 d1[x] = 0; 33 d2[x] = 0; 34 in1[x] = 1; 35 in2[x] = 1; 36 while(!que1.empty()) 37 { 38 str = que1.front(); 39 que1.pop(); 40 in1[str] = 0; 41 for(i = 1; i <= n; i ++) 42 { 43 if(d1[i] > d1[str]+p1[str][i]) 44 { 45 d1[i] = d1[str]+p1[str][i]; 46 if(in1[i] == 0) 47 { 48 in1[i] = 1; 49 que1.push(i); 50 } 51 } 52 } 53 } 54 while(!que2.empty()) 55 { 56 str = que2.front(); 57 que2.pop(); 58 in2[str] = 0; 59 for(i = 1; i <= n; i ++) 60 { 61 if(d2[i] > d2[str]+p2[str][i]) 62 { 63 d2[i] = d2[str]+p2[str][i]; 64 if(in2[i] == 0) 65 { 66 in2[i] = 1; 67 que2.push(i); 68 } 69 } 70 } 71 } 72 ans = -1; 73 for(i = 1; i <= n; i ++) 74 { 75 if(ans < d1[i]+d2[i]&&d1[i]+d2[i] < N) 76 ans = d1[i]+d2[i]; 77 } 78 printf("%d\n",ans); 79 return 0; 80 }