題意:圖上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,每給一對門上的鎖對應鑰匙的編號,說 必需要這 倆把鑰匙的一把 至...