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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2-SAT

發(fā)布時(shí)間:2024/4/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2-SAT 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2-Satisfiability

2可滿足性,2-SAT或僅2SAT是將值賦值給變量的計(jì)算問題,每個(gè)變量具有兩個(gè)可能的值,以滿足變量對的約束系統(tǒng)。這是一般布爾可滿足性問題的一個(gè)特例,它可能涉及對兩個(gè)以上變量的約束,以及約束滿足問題,這可以允許對每個(gè)變量的值進(jìn)行兩次以上的選擇。但與NP完全的那些更一般的問題形成對比,可以在多項(xiàng)式時(shí)間內(nèi)求解2-可滿足性。

個(gè)人理解

多個(gè)約束條件每個(gè)約束有兩個(gè)限制,判斷是否存在滿足所有條件的合理解

思路

對于這樣的一組限制 AAABBB不能同時(shí)存在,我們可以轉(zhuǎn)化成滿足AAA的條件下BBB就不能滿足,對應(yīng)建圖的時(shí)候我們把每個(gè)點(diǎn)拆成兩個(gè)情況or不選,根據(jù)情況建邊

1.是否存在解

hihoCoder #1467
Tarjan縮點(diǎn),如果一個(gè)強(qiáng)連通分量里面存在矛盾(一個(gè)點(diǎn)選和不選同時(shí)存在)就不存在解

2.求一個(gè)字典序最小的解

hihoCoder #1468
暴力DFS O(NMNMNM)
首先SAT建邊,然后對于每個(gè)點(diǎn)先從小的序號(hào)DFS,之后判斷標(biāo)記的點(diǎn)中是否存在矛盾,如果拆成的兩個(gè)點(diǎn)都存在矛盾,那就無解

vector<int> g[maxn]; int vis[maxn], temp[maxn], len;int other(int x) {return (x & 1) ? x+1 : x-1; }int dfs(int x) {if (vis[other(x)]) return 0;if (vis[x]) return 1;temp[len++] = x;vis[x] = 1;for (int i = 0, y; i < (int)g[x].size(); ++i) {y = g[x][i];if (dfs(y) == 0) return 0;}return 1; }int Twosat() {for (int i = 1; i <= n; ++i) {if (vis[i*2] || vis[i*2-1]) continue;if (dfs(i*2-1) == 0) {for (int j = 0; j < len; ++j) {vis[temp[j]] = 0;}len = 0;if (dfs(i*2) == 0) {return 0;}}}return 1; }if (Twosat()) {for (int i = 1; i <= n; ++i) {if (vis[i*2-1]) cout << "R";else cout << "B";}cout << endl; }else cout << -1 << endl;

總結(jié)

以上是生活随笔為你收集整理的2-SAT的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。