题目
答案
#include<iostream>
#include<algorithm>
using namespace std;
int a[30001],vis[30001],n,m;
void init()//初始化
{
for(int i=1;i<=n;i++)
{
a[i]=i;
vis[i]=1;
}
}
int find(int tmp)//寻找根节点
{
while(tmp!=a[tmp])
tmp=a[tmp];
return tmp;
}
void combine(int x,int y)//将同一个朋友圈的人放在一起
{
int tmp1=find(x),tmp2=find(y);
if(tmp1==tmp2) return;
a[tmp2]=tmp1;
vis[tmp1]+=vis[tmp2];//根节点统领的节点总数增加
}
int main()
{
cin>>n>>m;
int n1,x,y;
init();
while(m--)
{
cin>>n1>>x;
if(n1>1)
{
for(int i=2;i<=n1;i++)
{
cin>>y;
combine(x,y);
}
}
}
cout<<*max_element(vis,vis+n);
//此函数用来查询最大值所在的第一个位置,*表示求值
}
总结
这道题运用了并查集的思想,很好地满足了这道题目的需求(我之前想的是邻接矩阵的广度优先遍历,但二维矩阵所需空间太大,无法满足要求)
不了解什么是并查集的同学,我推荐你看一下这篇文章——并查集详解 ——图文解说,简单易懂(转),里面有较为生动形象的讲解。相信看完后,你再回来理解会更轻松些
另外,再介绍一下max_element
这个函数,它是用来查询最大值所在的第一个位置,并返回其地址(本人觉得是既常用又好用的c++函数,在此推荐给大家)