bzoj1823(2 sat)

来源:互联网 发布:跳跃网络被告 编辑:程序博客网 时间:2024/06/06 01:20


the first 2 sat

#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<cmath>#include<stack>using namespace std;const int N=205;int n,m;int head[N],to[N*N],pre[N*N],tot;void addedge(int u,int v) {to[++tot]=v;pre[tot]=head[u];head[u]=tot;}int num(char *ch){int len=strlen(ch),ans=0;for (int i=1;i<len;i++) ans=ans*10+ch[i]-'0';return ans;}int rev(int num){if (num>n) return num-n;return num+n;}int dfn[N],low[N],tt,pos[N];int in[N],ss;stack<int> s;void dfs(int u){low[u]=dfn[u]=++tt;in[u]=1;s.push(u);for (int i=head[u];i;i=pre[i])if (!dfn[to[i]]){dfs(to[i]);low[u]=min(low[u],low[to[i]]);}else if (in[to[i]]==1) low[u]=min(low[u],dfn[to[i]]);if (dfn[u]==low[u]){int v;ss++;do{v=s.top();s.pop();in[v]=2;pos[v]=ss;}while (v!=u);}}void work(){memset(head,0,sizeof(head));tot=0;memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));tt=0;memset(in,0,sizeof(in));ss=0;memset(pos,0,sizeof(pos));scanf("%d%d",&n,&m);char ch[7];int num1,num2;for (int i=1;i<=m;i++){scanf("%s",ch);num1=num(ch);if (ch[0]=='h') num1+=n;scanf("%s",ch);num2=num(ch);if (ch[0]=='h') num2+=n;addedge(rev(num1),num2);addedge(rev(num2),num1);}for (int i=1;i<=n*2;i++) if (!dfn[i]) dfs(i);bool o=true;for (int i=1;i<=n;i++) if (pos[i]==pos[i+n]) o=false;if (o) printf("GOOD\n");else printf("BAD\n");}int main(){int T;scanf("%d",&T);while (T--) work();return 0; }


0 0