poj2723 2sat判斷解 二分

2022-05-04 10:24:08 字數 1086 閱讀 5522

典型的2-sat問題,題意:有m個門,每個門上倆把鎖,開啟其中一把即可,現在給n對鑰匙(所有

鑰匙編號0123456...2n-1),每對鑰匙只能用一把,要求盡可能開門多(按順序,前max個)。

關鍵是題意的分析與轉化,只能選一?必然2-sat,每給一對門上的鎖對應鑰匙的編號,說:必需要這

倆把鑰匙的一把(至少),即:a^b,所以,建圖了可以,總結通法:對應的資料編號:0123..,每個

數代表原來的乙個「狀態」/「命題」/「資料」,使之01為一對(只取乙個),23一對,...依次,建圖

此題要求最值,二分即可。

注意點(wa之因):1.編號後全圖全按編號走啊!原來資料基本無用,只是有時候輸出時之用,或建立

資料雙向關係!2.對於每次二分,對應數要重新建圖,注意初始化!

ps:一晚沒成功,結果早上起來2分鐘,ac!上午效率就是高!切記不可熬夜!身體健康第一位!

#include//36ms

#include#include#include#includeusing namespace std;

const int max=3000;

vectorkeys(max);int n,m;int times=0;

int belong[max];

int low[max];int dfn[max];int visited[max];int isinstack[max];stacks;

int scc[max];int numblock=0;

struct request //條件

;request requests[max];

vector>edges(max); //圖

void clear()

}void tarjan(int u) //dfs

else if(isinstack[v]&&dfn[v]left) //二分之

if(check(mid))

left=mid;

else right=mid;

count=mid;

}printf("%d\n",left);

}}

poj 2723 2 SAT(鎖開鑰匙救人)

題意 某人要去乙個地方救朋友。已知他有n對鑰匙,一共2n把。要求每對鑰匙只能選一把來用。有m個門,每個門有2把鎖,只要開啟其中的一把鎖就能開啟這個門。見到門的順序和輸入一致。給定鑰匙資訊以及每扇門上的兩把鎖的資訊,問如何選擇鑰匙能夠開啟最多的門。思路 因為有2n把不同鑰匙,所以圖的節點有4n個。如果...

POJ3648 2SAT解的求得

include include include include include include using namespace std const int nn 100 const int mm 1000 struct twosat void addedge int u,int v void tar...

POJ 2749 2SAT判定 二分

題意 圖上n個點,使每個點都與倆個中轉點的其中乙個相連 二選一,典型2 sat 並使任意兩點最大 距離最小 最大最小,2分答案 有些點相互hata,不能選同乙個中轉點,有些點相互love,必需選相同中轉點 顯然是2sat條件 關鍵 每次二分列舉limit,按limit建圖,需要注意的是每條邏輯語句對...