hdu1814 Peaceful Commission——2-SAT

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1814

第一次的2-SAT,推荐博客:https://blog.csdn.net/jarjingx/article/details/8521690

但这题就是暴力;

还调了好久...

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int const maxn=16005,maxm=40005;
int n,m,col[maxn],head[maxn],ct,ans[maxn],cnt;
struct N{
    int to,next;
    N(int t=0,int n=0):to(t),next(n) {}
}edge[maxm];
void add(int x,int y){edge[++ct]=N(y,head[x]); head[x]=ct;}
int op(int x){return x%2==0?x-1:x+1;}
bool paint(int x)
{
//    if(col[x])return col[x]%2;
    if(col[x])return 1;
    if(col[x^1])return 0;
    col[x]=1;
    ans[++cnt]=x;
    for(int i=head[x];i;i=edge[i].next)
        if(!paint(edge[i].to))return 0;
    return 1;
}
bool work()
{
    memset(col,0,sizeof col);
    for(int i=0;i<2*n;i+=2)
    {
        if(col[i]||col[i+1])continue;
        cnt=0;
        if(!paint(i))
        {
            while(cnt)//while(cnt--)则不太对! 
                col[ans[cnt]]=0,cnt--;
            if(!paint(i^1))return 0;
        }
    }
    return 1;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        memset(head,0,sizeof head); ct=0;
        for(int i=1,x,y;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            x--; y--;
//            add(x,op(y)); add(y,op(x));
            add(x,y^1); add(y,x^1);
        }
        if(work())
        {
            for(int i=0;i<2*n;i+=2)
            {
                if(col[i])printf("%d
",i+1);
                else printf("%d
",i+2);
            }
        }
        else printf("NIE
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Zinn/p/9208036.html