题目大意:
给你几个城市以及连通这几个城市的路线,问如果撤了一个城市,那么需要重新绘制多少个路线才能全部连通。
解题思路:
该题本质就是计算撤了一个城市后,连通图的个数,解决方法自然是图的遍历和深度优先,用的是最常规的方法,定义临界矩阵,访问数组,每遍历一个城市就更新访问数组,代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
// 定义好邻接矩阵,访问数组,城市个数
int connect[1010][1010];
bool visited[1010] = {false};
int N;
// 深度优先遍历图
void dfs(int node) {
visited[node] = true;
// 遍历各个节点,探寻是否有连接
for(int i = 1; i <= N; i ++) {
if(visited[i] == false && connect[node][i] == 1) {
dfs(i);
}
}
}
int main() {
int M, K;
int a, b;
// 输入城市数,连接线个数,要判断的减少的城市个数
cin >> N >> M >> K;
// 初始化邻接矩阵
for(int i = 0; i < M; i ++) {
cin >> a >> b;
connect[a][b] = 1;
connect[b][a] = 1;
}
// 遍历所有要减少城市的情况
for(int i = 0; i < K; i ++) {
// 统计连通图个个数
int ans = 0;
// 重新初始化访问数组
fill(visited, visited + 1010, false);
cin >> a;
visited[a] = true;
for(int i = 1; i <= N; i ++) {
if(visited[i] == false) {
dfs(i);
ans ++;
}
}
cout << ans - 1 << endl;
}
return 0;
}