D-Friends
简单翻译:有n个人,给你m条事实:如果a和b是朋友,b和c是朋友,那么a和c也是朋友。现在想要把这n个人分成若干个小组,每个小组中的每一个人都不是朋友,至少要分多少组?
简单并查集
求并查集中最大的元素个数便是最少的分组数量。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,m,ans,fa[N],sum[N];
//fa[i]表示元素i的父节点
inline int Find(int x)
{
if(x==fa[x]) return x;//如果是根节点,就返回
else return fa[x]=Find(fa[x]);//否则递归判断
}
inline void Union(int x,int y)
{
x=Find(x),y=Find(y);//分别查找根节点
if(x!=y)//如果不属于同一个集合
{
fa[y]=x;//合并
sum[x]+=sum[y];//分组个数要相加
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) //初始化
{
fa[i]=i;//每一个元素都是独立的集合
sum[i]=1;
}
while(m--)
{
int a,b;
cin>>a>>b;//输入关系
Union(a,b);//合并
}
for(int i=1;i<=n;i++)
if(Find(i)==i) //发现i就是根,说明一个完整集合出现
ans=max(ans,sum[i]);//比max
cout<<ans<<endl;
return 0;
}