此題的題意很簡單,有一些個門, 還有2 * n個鑰匙分成了n組,每組裡有兩把鑰匙,並且每組中只能使用一把鑰匙, 然後每個門有兩把鎖,分別對應著鑰匙,兩個鎖只要任意開乙個門就會開啟,並且,要開啟乙個門,必須保證他序號之前的所有門都開啟了,類似於一關一關的往裡闖
然後思路的話,由於是必須順序的開門,所以可以進行二分列舉答案,如果列舉的數為m, 則我們要判定的就是1~m的門是否能被開啟, 就要用2-sat建圖判定了
#include #include #include #include #include #include #define maxn 5005
#define maxm 50005
#define inf 1000000000
using namespace std;
struct edge
edge[maxm];
int n, m, e;
int top, scc, index;
int low[maxn], dfn[maxn], instack[maxn];
int head[maxn], st[maxn], fa[maxn];
int a[maxn], b[maxn], hash[maxn];
int x[maxn], y[maxn];
void init()
void insert(int x, int y)
void tarjan(int u)
else if(instack[v]) low[u] = min(low[u], dfn[v]);
}if(dfn[u] == low[u])
while(v != u);
}}bool check(int n)
void build(int bound)
for(int i = 1; i <= bound; i++)
for(int i = 1; i <= 2 * n; i++)
if(!dfn[i]) tarjan(i);
}void solve()
printf("%d\n", ans);
}int main()
for(int i = 1; i <= m; i++)
solve();
}return 0;
}
COJ 1253 二分 2 sat判定
x城的精神病院只有兩個病房,一共關著n 名病人,編號分別為1 n。病人之間的關係有時極不和諧。很多病人之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 不和諧值 乙個正整數值 來表示某兩名病人之間的仇恨程度,不和諧值越大,則這兩名病人之間的積怨越多。如果兩名不和諧值為c 的病人被關在同一...
POJ 2749 2SAT判定 二分
題意 圖上n個點,使每個點都與倆個中轉點的其中乙個相連 二選一,典型2 sat 並使任意兩點最大 距離最小 最大最小,2分答案 有些點相互hata,不能選同乙個中轉點,有些點相互love,必需選相同中轉點 顯然是2sat條件 關鍵 每次二分列舉limit,按limit建圖,需要注意的是每條邏輯語句對...
調整衛星(2 SAT 二分答案)
問題描述 某國上空有 n 顆衛星。每顆衛星有一次調整的機會 必須調整一次 方式是衛星可以向 y 軸正方向移動或 y 軸負方向移動指定長度。現在請你給每個衛星發出指令,讓衛星向正方向移動或是負方向移動,使得最後衛星分布中最近的兩顆衛星的距離最遠。請輸出最近兩顆衛星距離的平方。輸入格式 輸入第一行為乙個...