POJ3678-Katu Puzzle【2-SAT】
生活随笔
收集整理的這篇文章主要介紹了
POJ3678-Katu Puzzle【2-SAT】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:http://poj.org/problem?id=3678
題目大意
nnn個xix_ixi?為0/10/10/1。有mmm個條件表示xiandxj=ax_i\ and\ x_j=axi??and?xj?=a或xiorxj=ax_i\ or\ x_j=axi??or?xj?=a或xixorxj=ax_i\ xor\ x_j=axi??xor?xj?=a。
求構造一組合法的xix_ixi?。
解題思路
討論一下
時間復雜度O(n)O(n)O(n)
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #include<stack> using namespace std; const int N=2100; struct node{int to,next; }a[N*4000]; int n,m,tot,num,cnt,ls[N]; int dfn[N],low[N],color[N]; bool ins[N]; stack<int> S; void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return; } void tarjan(int x){dfn[x]=low[x]=++cnt;ins[x]=1;S.push(x);for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(!dfn[y])tarjan(y),low[x]=min(low[x],low[y]);else if(ins[y])low[x]=min(low[x],dfn[y]);}if(dfn[x]==low[x]){++num;while(S.top()!=x){color[S.top()]=num;ins[S.top()]=0;S.pop();}color[S.top()]=num;ins[S.top()]=0;S.pop();}return; } int main() {scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int a,b,w;char op[4];scanf("%d %d %d %s",&a,&b,&w,op);if(op[0]=='A'){if(w)addl(a,a+n),addl(b,b+n);else addl(b+n,a),addl(a+n,b);}if(op[0]=='O'){if(w)addl(b,a+n),addl(a,b+n);else addl(a+n,a),addl(b+n,b);}if(op[0]=='X'){if(w)addl(a,b+n),addl(b,a+n),addl(a+n,b),addl(b+n,a);else addl(a,b),addl(b,a),addl(a+n,b+n),addl(b+n,a+n);}}for(int i=0;i<2*n;i++)if(!dfn[i])tarjan(i);for(int i=0;i<n;i++)if(color[i]==color[i+n]){printf("NO\n");return 0;}printf("YES\n");return 0; }總結
以上是生活随笔為你收集整理的POJ3678-Katu Puzzle【2-SAT】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何访问无线路由器上的移动硬盘如何访问路
- 下一篇: 哪位大佬能帮初三学生选择电脑配件如何选电