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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

模板:2-SAT问题

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模板:2-SAT问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 實現
  • 代碼

所謂2-SAT,就是解決兩個SAT的問題

(逃)

前言

SAT 是適定性(Satisfiability)問題的簡稱。一般形式為 k - 適定性問題,簡稱 k-SAT。而當 k>2 時該問題為 NP 完全的。所以我們只研究 k=2 的情況。
2-SAT,簡單的說就是給出 k 個集合,每個集合有兩個元素,已知若干個 (a,b),表示 a 與 b 矛盾(其中 a 與 b 屬于不同的集合)。然后從每個集合選擇一個元素,判斷能否一共選 n 個兩兩不矛盾的元素。顯然可能有多種選擇方案,一般題中只需要求出一種即可。

感覺2-SAT也就是聽起來高大上
理解和代碼實現其實都不難
題目很多也都很板
不明白為什么這是個模板就紫的算法
這不比網絡流、平衡樹之類的陽間多了

實現

考慮建圖tarjan縮點
然后判斷,若a與a’同屬于一個分量,則矛盾
否則構造方案選tarjan染色編號小的那個點
這利用了tarjan棧的性質,相當于反的拓撲序
一個講的很清楚的地方

代碼

洛谷模板傳送門

#include<bits/stdc++.h> using namespace std; #define ll long long const int N=4e6+100; const int mod=998244353; ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f; } int n,m; int id[N][2]; struct node{int to,nxt; }p[N]; int fi[N],cnt=-1; void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt; } int dfn[N],low[N],tim,zhan[N],col[N],tot,top; void tarjan(int x){dfn[x]=low[x]=++tim;zhan[++top]=x;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(!dfn[to]){tarjan(to);low[x]=min(low[x],low[to]);}else if(!col[to]) low[x]=min(low[x],dfn[to]);}if(dfn[x]==low[x]){col[x]=++tot;while(zhan[top]!=x){col[zhan[top--]]=tot;}top--;} } int main(){memset(fi,-1,sizeof(fi));n=read();m=read();for(int i=1;i<=n;i++){id[i][0]=i;id[i][1]=i+n;}tot=2*n;for(int o=1;o<=m;o++){int i=read(),a=read(),j=read(),b=read();addline(id[i][!a],id[j][b]);addline(id[j][!b],id[i][a]);}for(int i=1;i<=2*n;i++){if(!dfn[i]) tarjan(i);}for(int i=1;i<=n;i++){if(col[i]==col[i+n]){printf("IMPOSSIBLE\n");return 0;}}printf("POSSIBLE\n");for(int i=1;i<=n;i++){printf("%d ",col[i]>col[i+n]);} } /* 4 1 2 3 4 */

總結

以上是生活随笔為你收集整理的模板:2-SAT问题的全部內容,希望文章能夠幫你解決所遇到的問題。

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