1013 Battle Over Cities

1 篇文章 0 订阅
0 篇文章 0 订阅

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

题意:有几个城市互相联通,现在有一个城市要消失,与其他城市的连接公路也消失,现在要保证有一个城市消失后,其余所有城市都必须相互通达,求要补修道路的条数

思路: 根据连通分量求补修公路的条数;假如有两个连通分量,则需要一条公路将他们连起来,连通分量减一即为补修公路数量

           dfs求连通分量;

/*
Sample Input
3 2 3
1 2
1 3
1 2 3
Sample Output
1
0
0
*/
#include<iostream>
#include<algorithm> 
using namespace std;
int G[1010][1010];
int vis[1010];
int N,M,K;
void dfs(int d)
{
	vis[d]=1;   //zz当初竟然写了vis[d]==1; 首先将此城市的访问量设置为1 
	for(int i=1;i<=N;i++)  //循环此城市所在矩阵的 “那一行” ,即此城市和其他城市的连接情况 
	{
		if(vis[i]==0&&G[d][i]==1) //如果找到一个新城市,没被访问过而且还和这个城市相连,则深度搜索这个城市 
		dfs(i); 
	} 
}
int main() 
{
	scanf("%d%d%d",&N,&M,&K);
	for(int i=0;i<M;i++)
	{
		int v,w;
		scanf("%d%d",&v,&w);   
		G[v][w]=1;    //用邻接矩阵存无向图 
		G[w][v]=1; 
	}
	for(int i=0;i<K;i++)
    {   int t;
    	scanf("%d",&t);       //录入将要消失的城市 
    	fill(vis,vis+1010,0); //每次循环一边都要重新定义一下vis数组(归0) 
    	vis[t]=1;             //将此城市的访问量设置为1,在以后的遍历当中不会遍历到 
    	int cnt=0;               //记录连通分量的个数,连通分量就相当于"岛屿数量"一题当中的岛的个数 ,连通块
		//遍历每个城市,寻找入口 
    	for(int j=1;j<=N;j++)   //涉及到图中城市的序号时,j要从1开始,到N,而不是从0开始 
    	{
    		if(vis[j]==0)  //当此城市没被访问,则深度搜索此城市 
    		{
    			dfs(j);
    			cnt++;   //连通分量数量加一 
			}
		}
		printf("%d\n",cnt-1);  //需要补修的公路数量为连通分量的数量减一;比如有两个连通分量,则需要一条公路将其连接起来,互相通达 
	}	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值