POJ 3268 Silver Cow Party(spfa)

题目链接

又是一个变量敲错,错了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 }
posted @ 2012-11-07 20:37  Naix_x  阅读(153)  评论(0编辑  收藏  举报