uva 10608 Friends 并查集
/* 题目: n个人中有m对人互为朋友,若a认识b,b认识c,则a认识c,问这n个人中最多有多少人 相互认识 分析: 并查集实现,把互为朋友的放置在同一集合中,询问最大人数时可以使用计数器计算该 人所在集合的父节点的数字 */ #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int X = 30002; int p[X],cnt[X],n,m; int find_set(int x) { if(x!=p[x]) p[x] = find_set(p[x]); return p[x]; } int main() { freopen("sum.in","r",stdin); freopen("sum.out","w",stdout); int t,x,y; cin>>t; while(t--) { memset(cnt,0,sizeof(cnt)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) p[i] = i; for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); x = find_set(x); y = find_set(y); if(x!=y) p[y] = x; } for(int i=1;i<=n;i++) { x = find_set(i); cnt[x]++; } int ans = 0; for(int i=1;i<=n;i++) ans = max(cnt[i],ans); cout<<ans<<endl; } return 0; }