题目链接:点击打开链接
题目大意:略。
解题思路:入门级并查集。
AC 代码
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int pre[30000+10], vis[30000+10];
void init()
{
for(int i=1;i<30000+10;i++) pre[i]=i;
mem(vis,0);
}
int find(int x)
{
int r=x;
while( pre[r]!= r )
r=pre[r];
int i=x, j;
while( i != r )
{
j = pre[i];
pre[i] = r ;
i = j;
}
return r ;
}
void join(int x,int y)
{
int fx=find(x),fy=find(y);
pre[fy]=fx;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
init();
int tn,a[n+10];
while(m--)
{
scanf("%d",&tn);
for(int i=0;i<tn;i++)
{
scanf("%d",&a[i]);
if(i) join(a[i-1],a[i]); // 小技巧
}
}
int rs=0;
for(int i=1;i<=n;i++)
{
// printf("%d == %d\n",i,find(i)); // 注意这里是 find(i),而不是 pre[i]
int rt=find(i);
vis[rt]++;
rs=max(rs,vis[rt]);
}
printf("%d\n",rs);
}
return 0;
}