bzoj1823(2 sat)

    xiaoxiao2021-03-25  135

    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; }

    转载请注明原文地址: https://ju.6miu.com/read-13173.html

    最新回复(0)