PAT甲级(Advanced Level)1013(无向图的连通分量)

      在战争中,让所有的城市都有公路连接是非常重要的。如果一个城市被敌人占领了,所有来自/前往该城市的公路都会关闭。我们必须立即知道我们是否需要修复任何其他公路以保持其余城市的连接。给出标有所有剩余公路的城市地图,你就应该迅速知道需要修复的公路数量。

例如,如果我们有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

《题目传送门》icon-default.png?t=M85Bhttps://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;
}

参考于柳神代码,由于和柳神代码基本相似就不贴上柳神代码

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值