2-sat幾種常見關係
2-sat這類問題一般都是對稱的
兩個點i,j
1. i,j不能同時選
2. i,j必須同時選
3. i,j至少選乙個
4. i不存在
兩種解法
第一種: 要求最小字典序-dfs
例題: hdu1814 peaceful commission
#include
using
namespace std;
const
int n=
8e3+5;
const
int m=
2e4+5;
int n,m,cnt,tot;
int head[n*2]
;int sta[n*2]
;bool vis[n*2]
;struct node
edge[m*2]
;void
add(
int u,
int v)
bool
dfs(
int u)
return1;
}bool
slove()
tot=0;
if(!dfs
(i+1))
return0;
}}}return1;
}int
main()
if(slove()
)}else
printf
("nie\n");
}return0;
}
第二種: tarjan縮點判斷是否方案存在(且輸出任意乙個方案)
例題:hdu3062 party
#include
using
namespace std;
const
int n=
1e6+5;
struct node
edge[n*2]
;int n,m;
int cnt,head[
2005];
void
add(
int u,
int v)
int dfn[
2005
],dfnindex,low[
2005
],vis[
2005];
int sta[
2005
],top;
int bcc[
2005
],bccindex;
void
tarjan
(int u)
else
if(vis[v])}
if(dfn[u]
== low[u]
)while
(sta[top--
]!= u);}
}bool
check()
return
true;}
intmain()
for(
int i=
1;i<=
2*n;i++)if
(!dfn[i]
)tarjan
(i);if(
check()
)printf
("yes\n");
else
printf
("no\n");
//輸出任意乙個方案
//for(int i=1;i<=n;i++)//}
return0;
}
兩道2分搜尋題33 981
在乙個旋轉過的有序陣列中找到目標值 根據規律可以得到,中間值如果小於最右值的話,那麼右半邊一定有序 否則左半邊一定有序。然後看target是否在有序的那一半範圍內,如果在,就縮小範圍在其中查詢 否則在另外一半查詢 public intsearch int nums,int target else r...
兩道選擇題
教授面帶微笑,走進教室,對我們說 我受一家機構委託,來做一項問卷調查,請同學們幫個忙。一聽這話,教室裡輕微的一陣議論開了,大學課堂本來枯燥,這下好玩多了。問卷表發下來,一看,只有兩道題。第一題 他很愛她。她細細的瓜子臉,彎彎的娥眉,面色白皙,美麗動人。可是有一天,她不幸遇上了車禍,痊癒後,臉上留下幾...
兩道選擇題
記得大學一堂選修課上。教授面帶微笑,走進教室,對我們說 我受一家機構委託,來做一項問卷調查,請同學們幫個忙。一聽這話,教室裡輕微的一陣議論開了,大學課堂本來枯燥,這下好玩多了。問卷表發下來,一看,只有兩道題。第一題 他很愛她。她細細的瓜子臉,彎彎的娥眉,面色白皙,美麗動人。可是有一天,她不幸遇上了車...