典型的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建圖,需要注意的是每條邏輯語句對...