HDU 1814 Peaceful Commission(2-SAT)

来源:互联网 发布:阿里云客服投诉电话 编辑:程序博客网 时间:2024/05/18 00:04
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int maxn=10000+5;struct TwoSAT{    int n;    vector<int> G[maxn*2];    bool mark[maxn*2];    int s[maxn*2],c;        bool dfs(int x){        if(mark[x^1]) return false;        if(mark[x]) return true;        mark[x]=true;        s[c++]=x;        for(int i=0;i<G[x].size();i++)            if(!dfs(G[x][i])) return false;        return true;    }        void init(int n){        this->n=n;        for(int i=0;i<2*n;i++) G[i].clear();        memset(mark,0,sizeof(mark));    }        void add_clause(int x,int xval,int y,int yval){        x=x*2+xval;        y=y*2+yval;        G[x^1].push_back(y);        G[y^1].push_back(x);    }        bool solve(){        for(int i=0;i<2*n;i+=2){            if(!mark[i]&&!mark[i+1]){                c=0;                if(!dfs(i)){                    while(c) mark[s[--c]]=false;                    if(!dfs(i+1)) return false;                }            }        }        return true;    }};TwoSAT solver;int n,m;struct edge{int u,v;};edge e[20000+5];int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        solver.init(n);        for(int i=0;i<m;i++) {            scanf("%d%d",&e[i].u,&e[i].v);            solver.add_clause((e[i].u-1)/2,((e[i].u-1)%2)^1,(e[i].v-1)/2,((e[i].v-1)%2)^1);        }        if(solver.solve()){            for(int i=0;i<n;i++){                if(solver.mark[i*2]==true) printf("%d\n",i*2+1);                else printf("%d\n",i*2+1+1);            }        }        else printf("NIE\n");    }    return 0;}

0 0
原创粉丝点击