曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。
陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上刷街了。非常悲劇的一點是,河蟹是一種不和諧的生物,當兩隻河蟹封鎖了相鄰的兩個點時,他們會發生衝突。
詢問:最少需要多少只河蟹,可以封鎖所有道路並且不發生衝突。
輸入格式:
第一行:兩個整數n,m
接下來m行:每行兩個整數a,b,表示點a到點b之間有道路相連。
輸出格式:
僅一行:如果河蟹無法封鎖所有道路,則輸出「impossible」,否則輸出乙個整數,表示最少需要多少只河蟹。
輸入樣例#1:
【輸入樣例1】3 31 2
1 32 3
【輸入樣例2】
3 21 2
2 3
輸出樣例#1:
【輸出樣例1】impossible
【輸出樣例2】
1
【資料規模】
1<=n<=10000,1<=m<=100000,任意兩點之間最多有一條道路。
//凌晨2:30開始寫,頭昏腦漲的,寫到3:20才ac。我太菜啦!
這是一道裸的二分圖黑白染色。對所給的圖進行黑白染色,如果可以完成黑白染色,就輸出數量更少的顏色數量,不能完成染色,就輸出impossible。換句話說,如果給的圖是乙個(或幾個)二分圖(不存在奇環),那麼就能封鎖成功,因為存在奇環河蟹們就不能封鎖成功。
黑白染色流程如下——
對於每個連通塊,選乙個起點,染上1色,向外拓展一圈,給它們染上2色,對每個2色的節點進行拓展,染上1色,以此類推,如果被拓展的節點已經被染色,且和這輪想要染的不同,就是染色失敗,直接輸出impossible退出即可。
記得apioday3下午王若松老師給我們提到過過這個演算法,我在課間去提問時,老師還為我重新耐心地講了一遍,感動……
#includeintn,m;
struct
edgee[
200010
];int head[100010]=,cnt=1
;void add(int u,int
v)bool vis[100010]=;
short color[100010]=;
intclo,num_to,num_clo;
bool dfs(int u,int
c)
else
}return1;
}int
main()
for(int i=1;i<=n;i++)
clo+=num_clo<(num_to-num_clo)?num_clo:(num_to-num_clo);
}printf("%d
",clo);
return0;
}
洛谷 P1330 封鎖陽光大學
曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上...
洛谷 P 1330 封鎖陽光大學
題目描述 曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與...
洛谷 P1330 封鎖陽光大學
曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是 一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路...