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 }

你可能感兴趣的:(SPFA)