在战争中,让所有的城市都有公路连接是非常重要的。如果一个城市被敌人占领了,所有来自/前往该城市的公路都会关闭。我们必须立即知道我们是否需要修复任何其他公路以保持其余城市的连接。给出标有所有剩余公路的城市地图,你就应该迅速知道需要修复的公路数量。
例如,如果我们有3个城市和2条连接城市1-城市2和城市1-城市3的高速公路。那么,如果城市1被敌人占领,我们必须修复一条公路,即城市2-城市3的公路。
Input
每个输入文件包含一个测试案例。每个案例以一行开始,包含3个数字N(<1000)、M和K,分别是城市的总数、剩余公路的数量和要检查的城市数量。然后是M行,每行用2个整数描述一条高速公路,这些整数是高速公路所连接的城市的编号。这些城市的编号从1到N。最后有一行包含K个数字,代表我们关注的城市。
Output
对于每一个K个城市,在一行中输出如果该城市丢失,需要修复的高速公路的数量。
Sample Input
3 2 3
1 2
1 3
1 2 3
Sample Output
1
0
0
《题目传送门》https://pintia.cn/problem-sets/994805342720868352/exam/problems/994805500414115840
题目大意:删掉图中某个点后,求图的连通分量,所求路的数量=连通分量-1
分析:使用邻接矩阵+dfs+判断数组visit[ ] 求联通分量cnt
#include<iostream>
#include<algorithm>
using namespace std;
bool visit[1009];
int amg[1009][1009];
int n, m, k;
void dfs(int index) {
visit[index] = true;
for (int i = 1; i <= n; i++) {
if (visit[i] == false && amg[index][i] == 1) {
dfs(i);
}
}
}
int main(){
cin >> n >> m >> k;
//录入数据
for (int i = 0; i < m; i++) {
int index1,index2;
cin >> index1 >> index2;
amg[index1][index2] = amg[index2][index1] = 1;
}
//删点后求连通分量
for (int i = 0; i < k; i++) {
fill(visit, visit + 1009, false);//注意每次都要翻新判读数组
int index,cnt=0;//cnt为连通分量的数量
cin >> index;
visit[index] = true;
for (int j = 1; j <= n; j++) {
if (visit[j] == false) {
dfs(j);//每次走到底走不通后跳出dfs函数即也说明连通分量cnt+1
cnt++;
}
}
cout << cnt-1 << endl;
}
return 0;
}
参考于柳神代码,由于和柳神代码基本相似就不贴上柳神代码