题目
题解
DFS。
对于每个删除的点,计算剩下的点构成的图的连通区域个数-1。
每次将被删掉的点标记一下,遍历全部剩余点,如果被标记则不进行统计,未被标记就+1,同时dfs,将从此能到达的点全部标记为1,最后统计的未被标记的点的个数-1就是答案。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int st[N];
int e[N<<2], ne[N<<2], h[N], idx;
void add (int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
void dfs (int x) {
st[x] = 1;
for (int i = h[x];~i;i = ne[i]) {
int j = e[i];
if (st[j]) continue;
dfs (j);
}
}
int main()
{
int n, m, k, a, b;
memset (h, -1, sizeof h);
scanf ("%d%d%d", &n, &m, &k);
for (int i = 0;i < m;i ++) {
// scanf ("%d%d", &a, &b);
cin >> a >> b;
add (a, b);
add (b, a);
}
while (k --) {
// scanf ("%d", a);
int ans = 0;
memset (st, 0, sizeof st);
cin >> a;
st[a] = 1;
for (int i = 1;i <= n;i ++)
if (!st[i])
ans ++, dfs (i);
// cout << max (ans-1, 0) << endl;
printf ("%d\n", max (ans-1, 0));
}
return 0;
}