題目提供者yeszy
標籤圖論福建省歷屆夏令營
難度普及+/提高
提交該題 討論
題解記錄
曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。
陽光大學的校園是一張由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,任意兩點之間最多有一條道路。
分析:兩個點之間有邊,如果乙個點選了那麼另乙個點就不能選,求選最少的點覆蓋所有路徑,這種型別的題可以用二分圖染色,先把列舉到的點染成1,和他相連的點染成2,和2相連的點染成1,如果發現相連的點如果已經被染色了,而且顏色相同則不行.因為要求最少的河蟹,所以答案每次累加染成1的個數和染成2的個數中的比較小的乙個.注意到圖可能是不連通的,在連通的情況下我們可以只用列舉乙個點,但是如果不連通,就必須要每個點都列舉一遍,為了防止重複計算,用乙個vis陣列記錄已經訪問過的點即可.
#include #include#include
#include
#include
using
namespace
std;
const
int maxn = 10010
;int
n, m;
vector
g[maxn];
bool
vis[maxn];
int a[maxn],sum[3
];bool dfs(int u, int
col)
}return
true;}
intmain()
int ans = 0
;
for (int i = 1; i <= n; i++)
if (!vis[i])
ans += min(sum[1], sum[2
]); }
printf(
"%d\n
", ans);
return0;
}
洛谷 P1330 封鎖陽光大學
曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上...
洛谷 P 1330 封鎖陽光大學
題目描述 曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與...
洛谷 P1330 封鎖陽光大學
曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是 一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路...