题目连接:https://www.patest.cn/contests/pat-a-practise/1013
并查集。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1010;
struct node{
int u, v;
};
node edge[500050]; //边最多(n * (n - 1))/ 2条
int f[maxn], h[maxn];
int n, m, k;
void init() {
for(int i = 0; i <= n; i++) {
f[i] = i;
h[i] = 0;
}
}
int find(int x) {
if(f[x] == x) return x;
else return f[x] = find(f[x]);
}
void unite(int x, int y) {
x = find(x);
y = find(y);
if(x != y) {
if(h[x] < h[y]) f[x] = y;
else {
f[y] = x;
if(h[x] == h[y]) h[x]++;
}
}
}
bool same(int x, int y) {
return find(x) == find(y);
}
int main() {
scanf("%d %d %d", &n, &m, &k);
for(int i = 1; i <= m; i++) {
scanf("%d %d", &edge[i].u, &edge[i].v);
}
int tmp;
for(int i = 1; i <= k; i++) {
init();
int ans = 0;
scanf("%d", &tmp);
for(int j = 1; j <= m; j++) {
if(edge[j].u != tmp && edge[j].v != tmp) {
unite(edge[j].u, edge[j].v);
}
}
for(int j = 1; j <= n; j++) {
if(f[j] == j) {
ans++;
}
}
printf("%d\n", ans - 2);
}
return 0;
}