这个题目很容易想到是统计去掉某结点以后的连通集个数,因为两个不同的连通集之间只需要加一个边即可变成连通集。
在图中常用的统计连通集个数的方法为:
-
①.图的遍历:对每个节点进行dfs,每次把能到达的结点设置为true,这样外层控制进入dfs函数的个数,统计即可得到连通集个数。
-
②.并查集,并查集的思路就很常规了,不断构建并查集的个数,统计根节点的个数即可得到连通集数量。
附本人AC代码:
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
vector<vector<int>>V(1010);
int deletepoint;
bool flag[1010];
void dfs(int n) {
if (n == deletepoint)return;
flag[n] = true;
for (int i = 0; i < V[n].size(); i++) {
if(flag[V[n][i]]==false)dfs(V[n][i]);
}
}
int main() {
int N, M, K, v1, v2, val;
scanf("%d%d%d", &N, &M, &K);
for (int i = 0; i < M; i++) {
scanf("%d%d", &v1, &v2);
V[v1].push_back(v2);
V[v2].push_back(v1);
}
for (int i = 0; i < K; i++) {
int block = 0;
scanf("%d", &deletepoint);
memset(flag,false,sizeof(flag));
for (int j = 1; j <= N; j++) {
if (flag[j] == false && j != deletepoint) {
dfs(j);
block++;
}
}
printf("%d\n", block - 1);
}
return 0;
}