1823: [JSOI2010]满汉全席

来源:互联网 发布:看淘宝 编辑:程序博客网 时间:2024/04/27 17:12

题目链接

题目大意:n个条件,选a||b,判断可行性

题解:2-sat

我的收获:第一个2-sat……本题只需要求可行性,tarjan后判断一下就好了
Orz

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int M=1005;int T,n,m,t;int scnt,tim,tp;int head[M],dfn[M],low[M],st[M],col[M];bool ins[M];struct edge{int to,nex;}e[M*4];void add(int u,int v){e[t].to=v,e[t].nex=head[u],head[u]=t++;}int get(){    int p;char c;    for(c=getchar();c!='m'&&c!='h';c=getchar());    scanf("%d",&p);p*=2;    return c=='m'?p:p+1;}void tarjan(int x){    int now=0;    dfn[x]=low[x]=++tim;    st[++tp]=x;ins[x]=1;    for(int i=head[x];i!=-1;i=e[i].nex){        int v=e[i].to;        if(!dfn[v]){tarjan(v);if(low[v]<low[x]) low[x]=low[v];}        else if(ins[v]&&dfn[v]<low[x]) low[x]=dfn[v];    }    if(low[x]==dfn[x]){        scnt++;        while(x!=now){            now=st[tp--];            ins[now]=0;col[now]=scnt;        }    }}void work(){    for(int i=1;i<=n*2+1;i++)         if(!dfn[i]) tarjan(i);    for(int i=1;i<=n;i++)        if(col[i*2]==col[i*2+1])            {puts("BAD");return ;}    puts("GOOD");}void init(){    int x,y,xh,yj;    t=0;memset(head,-1,sizeof(head));    for(int i=1;i<=M;i++) dfn[i]=low[i]=col[i]=0;    tim=scnt=tp=0;    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++){        x=get();y=get();        xh=x^1,yj=y^1;        add(xh,y);add(yj,x);    }}int main(){    cin>>T;    while(T--){        init();        work();    }    return 0;}
0 0