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 }

转载于:https://www.cnblogs.com/naix-x/archive/2012/11/07/2759400.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值