思路: 這是一個並查集問題。
接下來我們用C++進行編程:
#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 joint(int x, int y)
{
if(find(x) == find(y))
return;
cnt[par[y]] += cnt[par[x]];
par[par[x]] = par[y];
}
int main(){
int T;
cin >> T;
while(T--)
{
int n;
cin >> n;
int x, y;
init(2 * n + 5);
umap.clear();
int cntv = 0;
for(int i = 0; i < n; i++)
{
cin >> x >> y;
if(umap.find(x) == umap.end())
{
++cntv;
umap[x] = cntv;
}
if(umap.find(y) == umap.end())
{
++cntv;
umap[y] = cntv;
}
joint(umap[x], umap[y]);
}
int result = 0;
for(int i = 0; i <= cntv; i++)
result = max(result, cnt[find(i)]);
cout << result << endl;
}
return 0;
}