P1330 封鎖陽光大學 搜尋 染色

2022-04-30 21:45:14 字數 1949 閱讀 5770

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

陽光大學的校園是一張由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,任意兩點之間最多有一條道路。

這題質量很高,卡了我一天,最後也是有思路了,然而還是卡了幾次沒過,原來這題可能有不連通的子圖。。。

仔細研究題目之後,我們發現在這樣乙個無向圖中,按照題目要求,每條邊都要被佔據。

如果每條邊都要被佔據,那麼這條邊的兩端點必然有一點佔了乙個河蟹。

也就是說,乙個無向圖中,如果要滿足題目條件,必須滿足在每條邊都被佔據的情況下,每條邊兩端點上不能同時出現河蟹,但是其中有一點要有乙隻河蟹。

題解裡dalao管這思路叫染色,每條邊兩端不能出現相同顏色

我們可以搜一遍整個圖,記錄每個點是否被染色,以及每種顏色的染色次數。

因為這個顏色具體來說就代表著河蟹的位置,那麼,每次搜尋會得到兩種顏色的解,也就是說河蟹以這兩種方式放置是等價的,我們可以手模檢驗一下。

我們只要取其中最小值就是河蟹的最小數量了。

1 #include2 #include3 #include4 #include5 #include6 #include7

#define n 20010

8using

namespace

std;

9int

head[n],tot,n,m;

10bool v[n*100],pr[n*100

];11

int sum[2

];12

struct

nodeg[n*100

];15

void add(int x,int

y)16

2021

bool dfs(int x,int

color)

2228 v[x]=1;pr[x]=color;//

記錄染色狀態

29 sum[color]++;//

記錄染色次數

30bool k=1;//

初始允許訪問

31for(int i=head[x];i&&k;i=g[i].next)

36return

k;37}38

intmain()

3947

int ans=0;48

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

4955 ans+=min(sum[0],sum[1]);//

很巧妙乙個地方,小的那乙個一定是河蟹的數量 56}

57 printf("

%d\n

",ans);

58return0;

59 }

2019-05-29 19:25:54

P1330 封鎖陽光大學

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

P1330 封鎖陽光大學

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

P1330 封鎖陽光大學

依題意可知,在圖中的每一條邊有且只有乙個點被選中 阻止老曹刷街 那麼就可以對其採取二分圖染色,一條邊中 乙個點為黑色,另乙個點為白色 如果一條邊中的兩個端點的顏色相同,則說明無解,輸出 ipossible 如果有解,就把白點的數目和黑點的數目取 min 即為答案。include include in...