曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。
陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上刷街了。非常悲劇的一點是,河蟹是一種不和諧的生物,當兩隻河蟹封鎖了相鄰的兩個點時,他們會發生衝突。
詢問:最少需要多少只河蟹,可以封鎖所有道路並且不發生衝突。
輸入格式:
第一行:兩個整數n,m
接下來m行:每行兩個整數a,b,表示點a到點b之間有道路相連。
輸出格式:
僅一行:如果河蟹無法封鎖所有道路,則輸出「impossible」,否則輸出乙個整數,表示最少需要多少只河蟹。
輸入樣例#1:
【輸入樣例1】輸出樣例#1:3 31 2
1 32 3
【輸入樣例2】
3 21 2
2 3
【輸出樣例1】【資料規模】impossible
【輸出樣例2】
1
1<=n<=10000,1<=m<=100000,任意兩點之間最多有一條道路。
/*view code一看這道題沒有什麼思路,就打了暴力,20分,然而輸出impossible 就40分,(>_
一看正解,很簡單的樣子,因為要求一條邊上的兩個點不能同時選,那我們就給每個點附上標記,1代表選,-1代表不選,類似於染色問題,如果一條邊上的點都是同一標記,則impossible,否則,統計出選或不選中少的那個即為答案。
注意,圖不一定是連通圖,所以要多dfs幾遍。
*/#include
#include
#define n 10010
#define m 100010
using
namespace
std;
intn,m,head[n],vis[n],flag,t1,t2;
struct
node
;node e[m*2
];void add(int i,int x,int
y)void dfs(int
x)
else
if(vis[e[i].v]==vis[x])
}int
main()
int ans=0
;
for(int i=1;i<=n;i++)
if(!vis[i])
if(flag)
printf("%d
",ans);
return0;
}
封鎖陽光大學 洛谷1330 bfs
曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上...
洛谷1330 封鎖陽光大學 DFS or BFS
題目描述 曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與...
洛谷 P1330 封鎖陽光大學
曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上...