PTA Advanced 1013 Battle Over Cities C++

  • 邻接矩阵存储无向图
  • 深度遍历统计连通分量的个数,再-1就是需要添加的边数
#include <iostream>

using namespace std;

int visited[1000];// 记录城市是否被访问过 
int edgeCpy[1000][1000];// 在循环里面使用的临时邻接矩阵 

// 从某个顶点开始的深度遍历
void deep(int x,int n){// x是开始顶点,n是顶点编号的最大值 
	// 设置该顶点被访问过
	visited[x]=1;
	// 找该顶点的相邻顶点
	for(int i=1;i<=n;i++){ 
		if(edgeCpy[x][i]==1&&visited[i]==0) deep(i,n);
	} 
	return;
}

int edge[1000][1000];// 邻接矩阵 
int deletedCity[1000];// 记录城市是否被删除(为1表示被删除) 

int main(int argc, char** argv) {
	int n;// 城市的数量 
	int m;// 边的数量 
	int k;// 需要检查的城市数量
	cin>>n>>m>>k;
	
	// 设置邻接矩阵
	for(int q=0;q<m;q++){
		int i,j;
		cin>>i>>j;
		edge[i][j]=1;
		edge[j][i]=1; 
	} 
	
	// 输入需要检查的城市编号,同时进行检查 
	for(int i=0;i<k;i++){
		int city;
		cin>>city;
		
		// 删除这个城市 
		deletedCity[city]=1;
		// 使用邻接矩阵副本
		for(int row=1;row<=n;row++)
			for(int col=1;col<=n;col++)
				edgeCpy[row][col]=edge[row][col];
		// 删除这个城市的边
		for(int j=1;j<=n;j++){
			edgeCpy[city][j]=0;
			edgeCpy[j][city]=0;
		} 
		// 刷新访问数组
		fill(visited,visited+n+1,0); 
		// 从各个连通分量的一个点开始深度遍历临界矩阵
		int componentNum=0;// 记录连通分量的个数 
		for(int j=1;j<=n;j++){
			if(visited[j]==1||deletedCity[j]==1) continue;// 如果这个城市已经被访问过或者已经删除了,则继续找下一个城市 
			componentNum++; 
			// 开始深度遍历
			deep(j,n); 
		} 
		if(componentNum>=1){
			cout<<componentNum-1<<endl;// 连通分量-1就是需要补充的最少边数 	
		}else{
			cout<<0<<endl;// 针对于只有一个城市的情况	
		}
		// 恢复这个城市,方便下一次使用
		deletedCity[city]=0;
	} 
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值