poj1364King

http://poj.org/problem?id=1364

WA了n次啊  一个a和b写反了。。无语了

题意好难懂  aSi + aSi+1 + ... + aSi+ni < ki or aSi + aSi+1 + ... + aSi+ni > ki 为了得到差分约束不等式 令sum[ni] = asi+asi+1+。。+asi+ni

上式就可变为 sum[ni+si]-sum[si-1]<=ki+1(sum[si-1]-sum[ni+si]>=-ki-1) or sum[ni+si]-sum[si-1]>=ki-1

bellford 判负环 即判断这些不等式能不能成立

View Code
 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<stdlib.h>

 5 using namespace std;

 6 int n,m,g;

 7 struct node

 8 {

 9     int u,v,w;

10 }e[210];

11 int dis[110];

12 int bellford()

13 {

14     int i,j,flag=0;

15     memset(dis,0,sizeof(dis));

16     for(i = 1 ; i <= n+1 ; i++)

17     {

18         flag = 0;

19         for(j = 1; j <= g; j++)

20         {

21             if(dis[e[j].v]>dis[e[j].u]+e[j].w)

22             {

23                 dis[e[j].v] = dis[e[j].u]+e[j].w;

24                 flag = 1;

25             }

26         }

27         if(!flag)

28         break;

29     }

30     if(flag)

31     return 0;

32     else

33     return 1;

34 }

35 int main()

36 {

37     int i,j,k,a,b,c;

38     char s[10];

39     while(cin>>n)

40     {

41         if(!n)

42         break;

43         cin>>m;

44         g=0;

45         for(i = 1; i <= m ; i++)

46         {

47             scanf("%d%d%s%d",&a,&b,s,&k);

48             if(s[0]=='g')

49             {

50                 g++;

51                 e[g].u = a+b;

52                 e[g].v = a-1;

53                 e[g].w = -1-k;

54             }

55             else

56             {

57                 g++;

58                 e[g].u = a-1;

59                 e[g].v = a+b;

60                 e[g].w = k-1;

61             }

62         }

63         if(!bellford())

64         {

65             puts("successful conspiracy");

66         }

67         else

68             puts("lamentable kingdom");

69     }

70     return 0;

71 }

 

 

你可能感兴趣的:(poj)