题目大意
给出n个城市之间有相互连接的m条道路,当删除一个城市和其连接的道路的时候,问其他几个剩余的城市至少要添加多少个路线才能让它们重新变为连通图.思路解析
通过深度优先或者广度优先遍历被删除节点之后的整个图,求出连通分量也就是极大联通子图的个数。修建路径条数就是个数-1.示例代码
#include<iostream>
#include<algorithm>
using namespace std;
int n, m, k, a, b;
int gra[1001][1001];
bool visited[1001];
void dfs(int v) {
visited[v] = true;
for (int i = 1; i <= n; i++) {
if (!visited[i] && gra[v][i] == 1) {
dfs(i);
}
}
}
int main() {
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i < m; i++) {
scanf("%d%d", &a, &b);
gra[a][b] = gra[b][a] = 1;
}
for (int i = 0; i < k; i++) {
fill(visited, visited + 1001, false);//每一次要重新初始化visited数组
scanf("%d", &a);
int count = 0;
visited[a] = true;//相当于被遍历过了
for (int j = 1; j <= n; j++) {
if (!visited[j]) {
dfs(j);
count++;
}
}
printf("%d\n", count - 1);
}
return 0;
}