n 位太空人,年齡小於平均值可執行任務 A、C;大於等於平均值可執行 B、C。部分太空人互相仇恨,不能分配同一任務。求滿足條件的分配方案。
true 表示選第一類任務(A 或 B),false 表示選 C。(x ∨ y) ∧ (¬x ∨ ¬y)(異或關係)。(x ∨ y)(至少一個選第一類)。struct TwoSAT {
int n; vector g[2*MAXN]; bool mark[2*MAXN]; int S[2*MAXN], sn;
void add_or(int u, int uval, int v, int vval) { // uval/vval: 0=false, 1=true
g[u*2+uval^1].push_back(v*2+vval);
g[v*2+vval^1].push_back(u*2+uval);
}
bool dfs(int u) {
if (mark[u^1]) return false;
if (mark[u]) return true;
mark[u]=true; S[sn++]=u;
for (int v:g[u]) if (!dfs(v)) return false;
return true;
}
bool solve() {
for (int i=0;i<2*n;i+=2)
if (!mark[i] && !mark[i+1]) {
sn=0;
if (!dfs(i)) { for (int j=0;j
若 mark[i*2+1] 為真,年齡 < 平均者輸出 A,≥ 平均者輸出 B;否則輸出 C。