BZOJ1823: [JSOI2010]满汉全席

2-SAT…

 1 /**************************************************************

 2     Problem: 1823

 3     User: zhuohan123

 4     Language: C++

 5     Result: Accepted

 6     Time:4 ms

 7     Memory:1300 kb

 8 ****************************************************************/

 9  

10 #include <iostream>

11 #include <cstdio>

12 #include <cstring>

13 #include <algorithm>

14 using namespace std;

15 inline int imin(int a,int b){return a<b?a:b;}

16 struct food{int h,m;}f[110];

17 struct point{int head,wk,dfn,low,instack;}p[210];int pnum;

18 struct edge{int to,next;}g[2100];int gnum;

19 void addedge(int from,int to)

20 {

21     g[++gnum].to=to;g[gnum].next=p[from].head;p[from].head=gnum;

22 }

23 int blocknum,dfsnum;

24 int s[210],sr;

25 void tarjan(int po)

26 {

27     p[po].dfn=p[po].low=++dfsnum;

28     s[++sr]=po;p[po].instack=true;

29     for(int i=p[po].head;i;i=g[i].next)

30     {

31         if(!p[g[i].to].dfn)

32         {

33             tarjan(g[i].to);

34             p[po].low=imin(p[po].low,p[g[i].to].low);

35         }

36         else if(p[g[i].to].instack)

37             p[po].low=imin(p[po].low,p[g[i].to].dfn);

38     }

39     if(p[po].dfn==p[po].low)

40     {

41         blocknum++;

42         while(s[sr]!=po)

43         {

44             p[s[sr]].wk=blocknum;

45             p[s[sr]].instack=false;

46             sr--;

47         }

48         p[s[sr]].wk=blocknum;

49         p[s[sr]].instack=false;

50         sr--;

51     }

52 }

53 int main(int argc, char *argv[])

54 {

55     int T;scanf("%d",&T);

56     while(T--)

57     {

58         pnum=gnum=blocknum=dfsnum=0;

59         memset(p,0,sizeof p);

60         int n,m;scanf("%d%d",&n,&m);

61         for(int i=1;i<=n;i++)f[i].h=++pnum,f[i].m=++pnum;

62         while(m--)

63         {

64             char str[60]={0};while(!str[0])gets(str);

65             int a=0,b=0,ha,hb,now=0;

66             while(str[now]!='h'&&str[now]!='m')now++;

67             ha=(str[now]=='h');

68             while(str[now]>'9'||str[now]<'0')now++;

69             while(str[now]>='0'&&str[now]<='9')a=a*10+str[now]-'0',now++;

70             while(str[now]!='h'&&str[now]!='m')now++;

71             hb=(str[now]=='h');

72             while(str[now]>'9'||str[now]<'0')now++;

73             while(str[now]>='0'&&str[now]<='9')b=b*10+str[now]-'0',now++;

74             if(ha&&hb)addedge(f[a].m,f[b].h),addedge(f[b].m,f[a].h);

75             if(!ha&&hb)addedge(f[a].h,f[b].h),addedge(f[b].m,f[a].m);

76             if(ha&&!hb)addedge(f[a].m,f[b].m),addedge(f[b].h,f[a].h);

77             if(!ha&&!hb)addedge(f[a].h,f[b].m),addedge(f[b].h,f[a].m);

78         }

79         for(int i=1;i<=pnum;i++)

80             if(!p[i].dfn)tarjan(i);

81         bool isgood=true;;

82         for(int i=1;i<=n;i++)

83             if(p[f[i].h].wk==p[f[i].m].wk)

84             isgood=false;

85         if(isgood)puts("GOOD");

86         else puts("BAD");

87     }

88     return 0;

89 }

 

你可能感兴趣的:(ZOJ)