题目链接:点击打开链接
题目大意:略。
解题思路:入门级并查集。
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; }