思路:
并查集建边,找孤立点,总数-2.
代码:
#include <bits/stdc++.h>
using namespace std;
#define M 1000005
#define N 1005
int f[N];
int a[M], b[M], k;
int n, m;
void init()
{
for (int i = 1; i <= n; ++i)
f[i] = i;
}
int Find(int x)
{
return f[x] == x ? x : f[x] = Find(f[x]);
}
void merge(int x, int y)
{
int t1 = Find(x);
int t2 = Find(y);
if (t1 != t2)
f[t2] = t1;
}
int solve(int x)
{
for (int i = 1; i <= m; ++i)
{
if (a[i] != x && b[i] != x)
merge(a[i], b[i]);
}
int sum = 0;
for (int i = 1; i <= n; ++i)
{
if (f[i] == i)
sum++;
}
return sum - 2;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m >> k;
for (int i = 1; i <= m; ++i)
{
cin >> a[i] >> b[i];
}
while (k--)
{
int cnt;
cin >> cnt;
init();
int num = solve(cnt);
cout << num;
if (k != 0)
cout << endl;
}
return 0;
}