- 使用全局变量得方法。
- 记得递归find方法。
- 人头从1重新开始编号,所以需要map。
#include<bits/stdc++.h> using namespace std; const int MAX_N = 2e5 + 5; int par[MAX_N], cnt[MAX_N]; unordered_map<int,int> umap; void init(int n){ for(int i = 0; i < n;i++){ par[i] = i;//各自 cnt[i] = 1;//计数, } } int find(int x){ if(par[x] == x) return x; else return par[x] = find(par[x]); } void Union(int x, int y){ if(find(x)==find(y)) return;// 统一交给y去处理 cnt[par[y]] += cnt[par[x]]; par[par[x]] = par[y]; } int main(){ int T,n; cin >> T; while(T--){ int n; cin>>n; init(2*n+5); umap.clear(); int cntv = 0; int x,y; for(int i = 0; i<n;i++){ cin>>x>>y; if(umap.find(x)==umap.end()){ ++cntv;//通过这种方法,人头就可以从1开始算了 umap[x] = cntv;//在记录人头得ID. } if(umap.find(y)==umap.end()){ ++cntv; umap[y] = cntv;//在记录人头得ID. } Union(umap[x],umap[y]); } int result = 0; for(int i = 0; i<= cntv;i++){//一定要从0开始,到当前人头,其实0不影响 result = max(result,cnt[find(i)]);// 找到那个集合得。 } cout<<result<<endl; } return 0; }