P1330 封鎖陽光大學

2022-03-04 21:12:51 字數 1628 閱讀 1030

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

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

solution:

由題意得每條邊必須且有且只有乙個頂點被封鎖,即一條邊所連向的兩點不得同時被封鎖,類似於二分圖,so可以理解為對圖染色,注意本圖可能存在多個連通圖,於是我們直接不停從沒有被標記的點開始dfs並染色,使得相鄰的點顏色不同,若某次訪問到了被標記的點,則判斷它的本次染色是否和本來顏色一致,不同則impossible,否則答案就是每個連通圖染色後最少的顏色個數的累加和。

**:

#include#define il inline

#define ll long long

#define n 200005

using

namespace

std;

il int

gi()

int n,m,a,b,h[n],cnt,to[n],net[n],rs[n],sum[2

],ans;

bool

vis[n];

il void add(int u,int

v)il

bool dfs(int x,int

c) vis[x]=1

; sum[rs[x]=c]++;

bool f=1

;

for(int i=h[x];i;i=net[i])f=f&&dfs(to[i],1-c);

returnf;}

intmain()

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

if(!vis[i])

ans+=min(sum[0],sum[1

]); }

cout

}

P1330 封鎖陽光大學

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

P1330 封鎖陽光大學

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

P1330 封鎖陽光大學

兩個和諧河蟹不能在同一條邊的兩端。所以對於每條邊。只有乙個節點有和諧河蟹 所以說,我們可以將有和諧河蟹的看做一種顏色,或則是狀態。沒有河蟹看做另一種言顏色 這樣邊變成了二分圖染色 所以嗯 就可以dfs暴力染色,不過要注意。有可能有多個圖 include include includeusing na...