1013 Battle Over Cities(无向图连通分量)

1013 Battle Over Cities (25 分)

It is vitally important to have all the cities connected by highways in a war. If a city is occupied by the enemy, all the highways from/toward that city are closed. We must know immediately if we need to repair any other highways to keep the rest of the cities connected. Given the map of cities which have all the remaining highways marked, you are supposed to tell the number of highways need to be repaired, quickly.

For example, if we have 3 cities and 2 highways connecting city​1​​-city​2​​ and city​1​​-city​3​​. Then if city​1​​ is occupied by the enemy, we must have 1 highway repaired, that is the highway city​2​​-city​3​​.

Input Specification:

Each input file contains one test case. Each case starts with a line containing 3 numbers N (<1000), M and K, which are the total number of cities, the number of remaining highways, and the number of cities to be checked, respectively. Then M lines follow, each describes a highway by 2 integers, which are the numbers of the cities the highway connects. The cities are numbered from 1 to N. Finally there is a line containing K numbers, which represent the cities we concern.

Output Specification:

For each of the K cities, output in a line the number of highways need to be repaired if that city is lost.

Sample Input:

3 2 3
1 2
1 3
1 2 3

Sample Output:

1
0
0

题目意思就是,给你们几个城市,然后给出几个由公路连接着的城市,然后再给出几个由于战争爆发二沦陷的城市,由于城市一沦陷的话,跟这个城市连接的城市之间的公路就会断,失去联系。题目要求输出剩下没有沦陷的城市要想两两之间连接,需要最少修几条公路。

一开始想到了并查集,但是又要消除节点,这个怎么实现呢?后来还是用连通图中连通分量知识来做,最少的修补道路就是图中的连通分量-1,直接DFS就可以求出几个连通分量。

#include<iostream>
#include<bits/stdc++.h>
const int maxn=1005;
typedef long long ll;
using namespace std;
//求解连通分量
// 连通分量数量-1 就是需要修建的道路数量 
vector<int>s[maxn];
int vis[maxn]; 
void dfs(int now) 
{
	vis[now]=1;
	for(int i=0;i<s[now].size();i++)
	{
		if(!vis[s[now][i]])
			dfs(s[now][i]);
	}
	return ;
}

int main()
{
	int n,m,k;
	cin>>n>>m>>k;
	int a,b;
	for(int i=0;i<m;i++)
	{
		cin>>a>>b;
		s[a].push_back(b);
		s[b].push_back(a);
	}
	while(k--)
	{
		memset(vis,0,sizeof(vis));
		cin>>a;
		vis[a]=1;
		int ans=0;
		for(int i=1;i<=n;i++)
		{
			if(!vis[i])
			{
				dfs(i);
				ans++;
			}
		}
		cout<<ans-1<<endl;
	}
	return 0;
}
发布了123 篇原创文章 · 获赞 83 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/tsam123/article/details/100765793