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\n",i+1); else printf("%d\n",i+2); } } else printf("NIE\n"); } return 0; }