黑白染色 封鎖陽光大學

2022-05-18 05:18:00 字數 1621 閱讀 5778

所謂黑白染色,就是指用bfs或dfs依次遍歷每乙個點,同時進行染色,一黑一白,如果遇到已經染過色的點並且點的顏色和即將要染的顏色衝突,就說明無法進行二分,無法滿足染色。大概就是這樣的。

下面我們看一道例題:

曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。

陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上刷街了。非常悲劇的一點是,河蟹是一種不和諧的生物,當兩隻河蟹封鎖了相鄰的兩個點時,他們會發生衝突。

詢問:最少需要多少只河蟹,可以封鎖所有道路並且不發生衝突。

輸入格式:

第一行:兩個整數n,m

接下來m行:每行兩個整數a,b,表示點a到點b之間有道路相連。

輸出格式:

僅一行:如果河蟹無法封鎖所有道路,則輸出「impossible」,否則輸出乙個整數,表示最少需要多少只河蟹。

輸入樣例#1: 

3 3

1 21 3

2 3

輸出樣例#1: 

impossible
輸入樣例#2: 

3 2

1 22 3

輸出樣例#2: 

1
【資料規模】

1<=n<=10000,1<=m<=100000,任意兩點之間最多有一條道路。

很顯然,這是一道裸的黑白染色題目,當然;也有別的解法,但我們這裡學的是黑白染色,所以就用黑白染色寫吧。

dfs遍歷並染色,有衝突,輸出impossible

沒有衝突,就取黑點個數和白點個數的min

**如下:

#include#include

#include

#include

#include

#define maxm 100000+5

#define maxn 10000+5

using

namespace

std;

intvis[maxn];

int n,m,head[maxn],v1=0,v2=0

;struct

edgee[

3*maxm];

int v[5

];int tot=0

;void add(int u,int

v)void dfs(int u,int

col)

}}int

x,y;

intmain()

int ans=0

;

for(int i=1;i<=n;i++)

}//printf("%d%d\n",v[1],v[2]);

printf("%d"

,ans);

return0;

}

如有錯誤,希望指出。

luoguP1330 封鎖陽光大學 黑白染色

題目描述 曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與...

封鎖陽光大學

description 曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了...

封鎖陽光大學

曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上...