代码1:
#include <iostream>
#include <stdio.h>
using namespace std;
int sum, n, m;
int father[1000];
int findset(int x) //查找
{
if(x != father[x]) {
father[x] = findset(father[x]); //回溯,路径压缩
}
return father[x];
}
void Union(int a, int b) //合并
{
int x = findset(a);
int y = findset(b);
if(x == y) return;
sum = sum - 1;
father[y] = x;
}
int main()
{
int t;
scanf("%d", &t);
for(int j = 1; j <= t; j++)
{
scanf("%d%d", &n, &m);
sum = n;
for(int i = 1; i <= n; i++) {
father[i] = i;
}
int first, second;
for(int i = 1; i <= m; i++)
{
scanf("%d%d", &first, &second);
Union(first, second);
}
printf("%d\n", sum);
}
return 0;
}
代码2:
#include<stdio.h>
#include<string.h>
#include <iostream>
using namespace std;
int pre[1000], mark[1000];
int find(int x) //并查集
{
int r = x;
while(r != pre[r]) {
r = pre[r];
}
return r;
}
bool join(int x,int y)
{
int a = find(x);
int b = find(y);
if(a == b) return false;
pre[b] = a;
return true;
}
int main()
{
int n, m, i, t;
int a, b, count;
scanf("%d", &t);
while(t--)
{
memset(mark, 0, sizeof(mark));
scanf("%d %d", &n, &m);
int nn = n;
for(i = 1; i <= n; i++)
pre[i] = i;
count = 0;
for(i = 1; i <= m; i++)
{
scanf("%d %d", &a, &b);
if(join(a, b))
nn--;
}
printf("%d\n", nn);
}
return 0;
}