CF1209D — Cow and Snacks
阿新 • • 發佈:2022-04-21
題意
by 程式碼源
思路
每個客人都有兩種喜歡的小吃,因此我們可以以小吃為點,每個客人的兩個喜歡的小吃之間連一條邊
對於一個 > 1 的連通塊,一定有一個客人吃到兩個點心,存在一種排序方式,使其他的人都吃到一個點心(比如 BFS序),因此一個
大小為 \(C\) 的連通塊可以滿足 \(C - 1\) 個客人。
假設連通塊的個數為 \(C\), 那麼開心的客人有 \(n - C\) 個,悲傷的客人就有 \(m - (n - C)\) 個
因此可以用並查集維護連通塊個數
SOLUTION
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10; int fa[N]; int find(int x) { if(fa[x] != x) fa[x] = find(fa[x]); return fa[x]; } int main() { int n, m; scanf("%d%d", &n, &m); for(int i = 1; i <= n; i ++ ) fa[i] = i; for(int i = 0; i < m; i ++ ) { int u, v; scanf("%d%d", &u, &v); fa[find(u)] = find(v); } int ans = 0; for(int i = 1; i <= n; i ++ ) if(i == find(i)) { ans ++; } printf("%d\n", m - n + ans); return 0; }