并查集
CODE:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=30010;
int p[maxn];
int rank[maxn];
int n, m;
int find(int x)
{
return p[x] == x? x: p[x] = find(p[x]);
}
void Union(int x, int y)
{
int i = find(x), j = find(y);
if(i == j) return ;
if(rank[i] > rank[j])
{
p[j] = i;
rank[i] += rank[j];
}
else
{
p[i] = j;
rank[j] += rank[i];
}
}
void init()
{
for(int i = 1; i <= n; i++) rank[i] = 1;
for(int i = 1; i <= n; i++) p[i] = i;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int ans = 0;
scanf("%d%d", &n, &m);
init();
for(int i = 0;i < m; i++)
{
int a, b;
scanf("%d%d", &a, &b);
Union(a, b);
}
for(int i = 1;i <= n; i++) ans >?= rank[i];
cout<<ans<<endl;
}
return 0;
}
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=30010;
int p[maxn];
int rank[maxn];
int n, m;
int find(int x)
{
return p[x] == x? x: p[x] = find(p[x]);
}
void Union(int x, int y)
{
int i = find(x), j = find(y);
if(i == j) return ;
if(rank[i] > rank[j])
{
p[j] = i;
rank[i] += rank[j];
}
else
{
p[i] = j;
rank[j] += rank[i];
}
}
void init()
{
for(int i = 1; i <= n; i++) rank[i] = 1;
for(int i = 1; i <= n; i++) p[i] = i;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int ans = 0;
scanf("%d%d", &n, &m);
init();
for(int i = 0;i < m; i++)
{
int a, b;
scanf("%d%d", &a, &b);
Union(a, b);
}
for(int i = 1;i <= n; i++) ans >?= rank[i];
cout<<ans<<endl;
}
return 0;
}