日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ3678-Katu Puzzle【2-SAT】

發(fā)布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ3678-Katu Puzzle【2-SAT】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

正題

題目鏈接:http://poj.org/problem?id=3678


題目大意

nnnxix_ixi?0/10/10/1。有mmm個條件表示xiandxj=ax_i\ and\ x_j=axi??and?xj?=axiorxj=ax_i\ or\ x_j=axi??or?xj?=axixorxj=ax_i\ xor\ x_j=axi??xor?xj?=a
求構造一組合法的xix_ixi?


解題思路

討論一下

  • xiandxj=0:x_i\ and\ x_j=0:xi??and?xj?=0:xix_ixi?xjx_jxj?不都是111,也就是xix_ixi?111那么xjx_jxj?必須為0,反之
  • xiandxj=1:x_i\ and\ x_j=1:xi??and?xj?=1:xix_ixi?xjx_jxj?都是111,這時候我們就構造矛盾條件xi=0x_i=0xi?=0xi=1x_i=1xi?=1限制xi=0x_i=0xi?=0即可,xjx_jxj?
  • xiorxj=0:x_i\ or\ x_j=0:xi??or?xj?=0:xix_ixi?xjx_jxj?都是000,和上面222一樣構造即可
  • xiorxj=1:x_i\ or\ x_j=1:xi??or?xj?=1:xix_ixi?xjx_jxj?不都是000,和上面111一樣構造即可
  • xixorxj=0:x_i\ xor\ x_j=0:xi??xor?xj?=0:那么xi=0?xj=0x_i=0\Rightarrow x_j=0xi?=0?xj?=0xi=1?xj=1x_i=1\Rightarrow x_j=1xi?=1?xj?=1,反之
  • xixorxj=1:x_i\ xor\ x_j=1:xi??xor?xj?=1:那么xi=0?xj=1x_i=0\Rightarrow x_j=1xi?=0?xj?=1xi=1?xj=0x_i=1\Rightarrow x_j=0xi?=1?xj?=0,反之
  • 時間復雜度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】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。