TwoSAT演算法模板

2022-03-14 09:22:42 字數 883 閱讀 1710

該模板來自大白書

【解釋】

給多個語句,每個語句為「 xi為真(假) 或者 xj為真(假)」

每個變數和拆成兩個點 2*i為假, 2*i+1為真

「xi為真 或 xj為真」  等價於 「xi為假 –>  xj為真」。

dfs演算法沒有回溯過程。

【函式說明】

模板bfs函式在模板外一般用不到

void init(int n) :初始化

void add(int x,int xval,int y,int yval) :新增邊,x,y為節點編號,xval=1表示真,xval=0表示假,yval同理

bool solve() :計算是否存在解。如果存在解返回true,不存在返回false

【變數說明】

vectorg[maxn*2];//鄰接表表示圖。

bool mark[maxn*2];//表示某個結點(不是變數)是否已經被訪問

int s[maxn*2],c;//s儲存某次dfs訪問過那些點。用於重新標記時消去之前訪問過的點的記錄(mark值)

struct

twosat

return

1;//

與之相連的變數都滿足。

}

void init(int n)//

初始化,n為變數個數(結點數2*n,從0開始)

void add(int x,int xval,int y,int yval)//

新增邊,xval=1表示真,xval=0表示假,yval同理

bool solve()//

計算。 }

}return1;

}}sat;

學習筆記(two sat)

關於具體演算法 連邊方法 可行方案 tarjan縮點判無解之後,重新反向建圖,開個陣列,將a與a 所在聯通塊互相標記為敵人,tope dp的時候,依次將點取出,如果其沒有顏色,則將其標記為true,同時將其的敵人標記為false即可 include include include include i...

匈牙利演算法模板 KM演算法模板

匈牙利演算法模板 時間複雜度為o ve v為二分圖左邊的頂點數,e為二分圖中邊的數目 include includeconst int maxn 1010 const int maxm 20010 const int max 10001 const int inf 1000000000 int li...

演算法模板 KMP演算法

kmp演算法 由d.e.knuth,j.h.morris和v.r.pratt提出的,串匹配演算法,一般串都是指字串。kmp是基於雙指標演算法的 應用 乙個字串在另外乙個字串 現的位置和迴圈節 一般地,被匹配的字串叫主串,用來匹配主串的叫模式串 如果我們不用kmp,來查詢乙個字串在另外乙個字串中第一次...