2 SAT 問題學習 模板

2021-08-20 07:36:33 字數 1717 閱讀 2522

首先來看這樣一道題:

gym 101201f illumination (two-sat)

題目鏈結

題意:乙個n*n的房子,有很多燈,每個格仔只能被上下方向照一次、左右方向照一次,每個燈可以選擇上下或是左右照,照明長度以自身位置為中心,占用2*r+1個格仔。問能否安排一種方案,使所有格仔滿足條件。

析:典型的two-sat,對於行來說,如果兩個能夠交叉,那麼他們不能都是左右,對於列也是一樣。

參考部落格:這裡寫鏈結內容

演算法學習部落格:

學習1各種模型

hzw縮點法

學習2ac**:tarjan縮點版

自己仿寫的模板

#include 

#include

using

namespace

std;

const

int maxn = 2e4+7;

typedef pair p;

struct twosat

void add_claues(int x,int xval,int y,int yval)

bool solve()}}

return

1; }

};map

int>mp;

vector

row[1005],col[1005];

twosat exsat;

int main()

for(int i=0;ifor(int i=0;ifor(int j=0;j<(int)row[i].size();j++)

}for(int j=0;j<(int)col[i].size();j++)}}

if(exsat.solve())printf("yes\n");

else

printf("no\n");

return

0;}

樣例:

sample input

3 2 5

1 1

1 3

3 1

3 3

2 2

sample output

yes

sample input

3 2 6

1 1

1 2

1 3

3 1

3 2

3 3

sample output

no ps:事實上這道題目的資料非常水

如下的dfs也可過:(只判斷燈)

#include

using

namespace

std;

int mp[1007][1007]=;

int ans;

int aa[1008];

int bb[1008];

int vv[1007][1007];

int n,r,l;

void dfs(int x,int y,int flag)

}else

if(vv[tx][ty]==flag)

}}int main()

int i;

for(i=1;i<=l;i++)}}

if(i<=l)printf("no\n");

else

printf("yes\n");

return

0;}

模板 2 SAT 問題 2 SAT

2 sat 問題 模板 有n個布林變數 x 1 x n 另有m個需要滿足的條件,每個條件的形式都是 x i 為true false或 x j 為true false 比如 x 1 為真或 x 3 為假 x 7 為假或 x 2 為假 2 sat 問題的目標是給每個變數賦值使得所有條件得到滿足。輸入格式...

模板 2 SAT 問題

2 sat問題主要解決的是一類二取一的問題.做法就是先建圖,然後跑tarjan,然後就判斷正負是否衝突,假如有衝突,就說明無解,否則就判斷哪個的序號大.話說我也不知道為什麼序號大就代表1.題幹 題目背景 2 sat 問題 模板 題目描述 有n個布林變數x1x 1x1 xnx nxn 另有m個需要滿足...

2 Sat模板詳解

這幾天看了一下2 sat,因為有tarjan以及拓撲排序等等的知識基礎,還是比較好理解的,我看到的有兩個模板,乙個是時間複雜度為o nm 另乙個時間複雜度為o m 但是第二種存在一種侷限,他只是能求解隨機的解,但是如果要是求解字典序最小的解,只能使用第一種解法.我們就用乙個例子來看一下第乙個模板 h...