CF1209D — Cow and Snacks

题目链接

题意

by 代码源

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;
}
posted @ 2022-04-20 22:47  ccz9729  阅读(59)  评论(0编辑  收藏  举报