2 SAT入門題兩道

2021-09-28 23:42:49 字數 1824 閱讀 7847

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...

兩道選擇題

教授面帶微笑,走進教室,對我們說 我受一家機構委託,來做一項問卷調查,請同學們幫個忙。一聽這話,教室裡輕微的一陣議論開了,大學課堂本來枯燥,這下好玩多了。問卷表發下來,一看,只有兩道題。第一題 他很愛她。她細細的瓜子臉,彎彎的娥眉,面色白皙,美麗動人。可是有一天,她不幸遇上了車禍,痊癒後,臉上留下幾...

兩道選擇題

記得大學一堂選修課上。教授面帶微笑,走進教室,對我們說 我受一家機構委託,來做一項問卷調查,請同學們幫個忙。一聽這話,教室裡輕微的一陣議論開了,大學課堂本來枯燥,這下好玩多了。問卷表發下來,一看,只有兩道題。第一題 他很愛她。她細細的瓜子臉,彎彎的娥眉,面色白皙,美麗動人。可是有一天,她不幸遇上了車...