并查集 找最大的子集 或者 bfs
#include <algorithm> #include <cstring> #include <cstdio> #include <cmath> #define N 30000+10 #define INF 999999 using namespace std; int n,m; int p[N]; int v[N]; int a,b; int find(int x){return p[x]==x?x:p[x]=find(p[x]); } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d %d",&n,&m); memset(v, 0, sizeof(v)); for(int i=1; i<=n; ++i) p[i]=i; for(int i=0; i<m; ++i) { scanf("%d %d",&a,&b); int nx=find(a); int ny=find(b); p[ny]=nx; } for(int i=1; i<=n; ++i) find(i);//必须在进行一遍,因为有的节点是以某一个子节点为父节点,而不是最终的父节点 for(int i=1; i<=n; ++i) { int x=p[i]; v[x]++; } int mx=0; for(int i=1; i<=n; ++i) { if(v[i]>mx) mx=v[i]; } printf("%d\n",mx); } return 0; }