题目来源于:洛谷
题目本质:并查集
解题思路:
我们以每种化为一个点,以每个客人喜欢的两朵花给两朵花连一条无向边。则会出现一定数目的连通块,连通块总个数为 ans。
对每个连通块进行分析:第一个客人买走 2朵,之后的客人每人买走 1 朵,这样在一个点数为 cnt的连通块中,可以满足 cnt-1个客人。这样便可使被满足的客人最多。则最终答案就是 k-(n-ans)=k-n+ans。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int f[N];
int find(int x){
return f[x]==x?x:f[x]=find(f[x]);
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
f[i]=i;
}
int res=0;
while(m--){
int u,v;
cin>>u>>v;
if(find(u)==find(v)){
res++;
}
else{
f[find(u)]=find(v);
}
}
printf("%d\n",res);
return 0;
}