用并查集+set就能快速地求出连通分量了
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
using namespace std;
const int N = 510;
int f[N];
int find(int x) {
if (x != f[x])
f[x] = find(f[x]);
return f[x];
}
int st[N];
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
f[i] = i;
while (m--) {
int a, b;
cin >> a >> b;
a = find(a), b = find(b);
if (a != b) {
f[a] = b;
}
}
set<int>s;
memset(st, false, sizeof st);
for (int i = 1; i <= n; i++) {
s.insert(find(i));
}
cout << s.size() << endl;
}