POJ 2749 2SAT判定 二分

2022-05-04 10:18:08 字數 1035 閱讀 4970

題意:圖上n個點,使每個點都與倆個中轉點的其中乙個相連(二選一,典型2-sat),並使任意兩點最大

距離最小(最大最小,2分答案),有些點相互hata,不能選同乙個中轉點,有些點相互love,必需選相同中轉點

(顯然是2sat條件)。

關鍵:每次二分列舉limit,按limit建圖,需要注意的是每條邏輯語句對應兩條邊(相互對稱,邏輯上互為假言易位),

如:必需連通乙個點,邏輯語句倆條:a->b,b->a,對應各自假言易位式,4條邊。

相信二sat不再是問題了。

#include//1200ms/2000ms 1a

#include#include#include#include#include#includeusing namespace std;

struct point

;vector>e(1050);

int n,a,b;point s1,s2; int maxdis=4000001;

point po[505]; point hate[1005]; point love[1005];

int absint(int x)

int dis(point aa,point bb) //距離

void build(int limit) //每次二分後建圖

if((dis(po[i],s1)+dis(po[j],s1))>limit)

if((dis(po[i],s2)+dis(po[j],s2))>limit)

}for(int i=0;is; int num=0;

void tarjan(int u) //下邊是2sat縮點判斷可行

else if(instack[v]&&dfn[v]left+1)

else

left=mid;

}if(check(right-1))printf("%d\n",right-1);

else printf("%d\n",right);

return 0;

}

POJ 2723 二分 2 sat 判定

此題的題意很簡單,有一些個門,還有2 n個鑰匙分成了n組,每組裡有兩把鑰匙,並且每組中只能使用一把鑰匙,然後每個門有兩把鎖,分別對應著鑰匙,兩個鎖只要任意開乙個門就會開啟,並且,要開啟乙個門,必須保證他序號之前的所有門都開啟了,類似於一關一關的往裡闖 然後思路的話,由於是必須順序的開門,所以可以進行...

COJ 1253 二分 2 sat判定

x城的精神病院只有兩個病房,一共關著n 名病人,編號分別為1 n。病人之間的關係有時極不和諧。很多病人之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 不和諧值 乙個正整數值 來表示某兩名病人之間的仇恨程度,不和諧值越大,則這兩名病人之間的積怨越多。如果兩名不和諧值為c 的病人被關在同一...

poj2723 2sat判斷解 二分

典型的2 sat問題,題意 有m個門,每個門上倆把鎖,開啟其中一把即可,現在給n對鑰匙 所有 鑰匙編號0123456.2n 1 每對鑰匙只能用一把,要求盡可能開門多 按順序,前max個 關鍵是題意的分析與轉化,只能選一?必然2 sat,每給一對門上的鎖對應鑰匙的編號,說 必需要這 倆把鑰匙的一把 至...