题解 CF1209D 【Cow and Snacks】

SIGSEGV

2019-09-18 19:25:22

Solution

因为每只动物都有2个最喜欢的点心,所以以点心为点,连接所有动物喜欢的两种点心见图。 考虑一个大小$>1$的联通块。肯定有一个动物得吃到2种点心,而总有一种排队顺序使得这个块中没有任何一头动物再吃到2种点心(比如说BFS序),那么一个大小为$c$的联通块可以满足$c-1$个动物。 设联通块个数为$C$,则高兴的动物有$n-C$个,悲伤的动物有$m-(n-C)$个。 使用$DSU$(并查集)实现。 ```cpp #include <bits/stdc++.h> using namespace std; const int N = 100005; int n,kk,f[N],sz[N]; int getf(int v) {if (f[v] != v) f[v] = getf(f[v]);return f[v];} int main () { ios::sync_with_stdio(false); cin >> n >> kk; int t1,t2; for (int i = 1;i <= n;i++) f[i] = i; for (int i = 1;i <= kk;i++) { cin >> t1 >> t2; f[getf(t1)] = getf(t2); } int cnt = 0; for (int i = 1;i <= n;i++) if (f[i] == i) ++cnt; cout << kk - (n - cnt); return 0; } ```