1013 Battle Over Cities

2023-05-16

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 city1​-city2​ and city1​-city3​. Then if city1​ is occupied by the enemy, we must have 1 highway repaired, that is the highway city2​-city3​.

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

在战争中,让所有城市通过高速公路连接起来至关重要。如果一个城市被敌人占领,所有往返该城市的高速公路都将关闭。我们必须立即知道是否需要修复任何其他高速公路以保持其他城市的连接。给定标记了所有剩余高速公路的城市地图,您应该快速告诉需要修复的高速公路数量。  

 例如,如果我们有 3 个城市和 2 条高速公路连接城市 1 -城市 2 和城市 1 -城市 3 .那么如果1号城被敌人占领,我们必须修好1条公路,那就是公路城2-3号城。   

输入规范:每个输入文件包含一个测试用例。每种情况都以一条线开头,其中包含 3 个数字 N (<1000)、M 和 K,分别是城市总数、剩余高速公路数量和要检查的城市数量。然后是M行,每条线用2个整数描述高速公路,这是高速公路连接的城市编号。城市编号从1到N。最后有一条包含K数字的线,代表我们需要关注的城市。   

输出规格:对于 K 个城市中的每个城市,如果该城市丢失,则在一条线路中输出需要修复的高速公路数量。(这是从1开始判断的)

 


自行理解:如1城市丢失,要修复多少,2城市丢失,要修复多少.....

题目就是要连接起剩下所有城市!

一开始只有1-2,1-3没有2-3是因为只要前两个连接了,那自然可以借助1这个城市从2-3(画图就很明确),不需要多线,只要满足所有城市都能互相联通即可。

一开始是所有城市都是联通的,一旦开始破环就不一定了,要修复最少的城市使得所有城市再次联通。

AC

#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int n, m, k;
int occupied, cnt = 0;
//vector<int>city;err
//你要存放两个量,一个是根,另一个是孩子
//而一个根是可能有多个孩子的,所以,就需要给孩子一个位置还有孩子的值
//因此就需要开容器类型的int容器,int型用来存放孩子的值,容器类型的容器用来存放位置
//使用的时候优先是最里面的,也就是直接写一个[]的时候表示的是值,再写一个[]就到外面的表示不同的位置。
//int容器存值,容器类型的vector给出足够的空间存放多个孩子.
vector<vector<int>>city;
bool visited[1010];

void dfs(int cur)
{
	if (cur == occupied || visited[cur])
		return;

	visited[cur] = true;
	for (int i = 0; i < city[cur].size(); i++)
	{
		dfs(city[cur][i]);
	}
}
int main()
{
	cin >> n >> m >> k;

	int c1, c2;
	city.resize(n + 1);
	for (int i = 0; i < m; i++)
	{
		cin >> c1 >> c2;
	/*	city[c1] = c2;
		city[c2] = c1;*///err,不明确位置,直接push_back最好
		city[c1].push_back(c2);
		city[c2].push_back(c1);

	}

	

	for (int i = 0; i < k; i++)//选定不同的城市被占领
	{
		cin >> occupied;
		fill(visited, visited + 1010, false);//初始化
		cnt = 0;
		for (int j = 1; j <= n; j++)//1-n的城市作为顶点遍历
		{
			if (visited[j] != true && j != occupied)
			{
				dfs(j);
				cnt++;
			}
		}

       cout << cnt - 1<<endl;
	}

	
	return 0;
}

解析

先理解联通分量,可以参考链接:联通分量 

//思考:从1开始设每一个城市为顶点,然后一直标记能访问的所有城市,
//直到出现一个城市能够使得前面所有城市的visited之和能全部联通为止。
//首先,不用担心停止之后的城市会不会有城市能比前面城市作为顶点的时候覆盖的更多,能够修复更少的道路。
//因为我们必须保证所有城市联通,如果前面的顶点能联通后面的城市,那么其实后面的作为顶点的情况是一样的。
//而如果不能,那么你无论前面的城市作为顶点还是后面的都无法互相联通,根本就不存在这种覆盖更多的情况。实际上如果无法联通,
//那么就还是要往下一个城市遍历。
//
//其次就是每一次,我们把这一堆连接起来的城市当作一个区域,每次划一个城市为顶点,互相连接的城市就作为一个域。
//而修最少道路的方法就是直接将每一个区域直接修一条路将两个区域连接起来(随便你怎么连,修一条路将两者联通即可)
//,一直到能联通所有城市为止。
//
//cnt-1很好理解。如3个域至少要两条线才能全部联通.



#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> city;
bool visited[1010];
void dfs(int cur, int occupied)
{
	if (cur == occupied || visited[cur])
		//只要当前城市被占领,自然当前visit不能被标记,表示不能联通
		//而如果visited已经被标记,就说明已经该城市已经联通,就直接剪枝。
		return;
	visited[cur] = true;//一直标记访问表示可以联通,如果没有标记就说明不行。不能联通就会在main中的循环重新寻找顶点
	for (int i = 0; i < city[cur].size(); i++)
		dfs(city[cur][i], occupied);

	//之所以可以用标记法就是因为实际上只要他们连在一起,他们只要是连接的状态,不分连接方式,都是能够访问到最终的那个城市的
	//因为可以重复行走,所以只要是出了被攻占的城市,所有的任意一个城市只要四访问过了,都是可以连接的。
	//因为一直都是在顶点之下建立的visit,所以一直是联通的。
}
int main()
{
	int n, m, k;
	cin >> n >> m >> k;
	city.resize(n + 1);//设置容器数量
	int temp1, temp2;
	for (int i = 1; i <= m; i++)//构造图 
	{
		cin >> temp1 >> temp2;
		city[temp1].push_back(temp2);
		city[temp2].push_back(temp1);
		//城市1与2都有成为顶点的可能
	}
	int occupied, cnt;
	for (int i = 0; i < k; i++)
	{
		cin >> occupied;
		fill(visited, visited + 1010, false);//重置visited数组 
		cnt = 0;
		for (int j = 1; j <= n; j++)//求出有几个连通分量 
			//为什么一定要是1?
			//因为必须城市是1-N,输入的occupied从1开始
			//对应起来方便

			//这个循环的作用就是将每一个没有被占领的城市当作顶点,查询是否联通城市
			//因为我们不清楚究竟哪个城市才是顶点,所以全部遍历

			{
			if (!visited[j] && j != occupied)
			{
				dfs(j, occupied);
				cnt++;//表示一个联通域,也就是联通分量

			}
		}
		cout << cnt - 1 << endl;
	}
	return 0;
}


 个人开始解题遇到的一些问题

#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int n, m, k;
int road[1000];

int main()
{
	cin >> n >> m >> k;

	int c1, c2;
	for (int i = 0; i < m; i++)
	{
		cin >> c1 >> c2;
		road[c1] = c2;//标记表示已连接
		//相当于是父子节点
		//只要根节点是一样的,所有子节点都能互相连通。
		//这是并查集的思想,但感觉不好理解不想尝试解题
		//是对的,但是图论感觉会更好
		//其实你的思路是对的,就是缺乏实现代码的经验,
		//图论和并查集其实是有许多相似之处的
		//两个思想很类似
	}

	for (int i = 0; i < k; i++)
	{
		cout << ;
	}
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1013 Battle Over Cities 的相关文章

  • 一个毕业6年的程序员工作经历和成长感悟(终)

    接上篇 xff1a 一个毕业6年的程序员工作经历和成长感悟 xff08 上 xff09 一个毕业6年的程序员工作经历和成长感悟 xff08 中 xff09 一个毕业6年的程序员工作经历和成长感悟 xff08 下 xff09 回望过去 6 年
  • 红包随机算法,给定一定的金额,一定的人数,保证每个人都能随机获得一定的金额。...

    前段时间做了一个笔试题 xff0c 觉得很有意思 xff0c 特此记录下来 题目如下 题目 请编写一个红包随机算法 需求为 xff1a 给定一定的金额 xff0c 一定的人数 xff0c 保证每个人都能随机获得一定的金额 比如100元的红包
  • linux下 ftp服务器如何设置上传文件的权限

    先用vi打开 vsftpd conf vsftpd的配置文件在Ubuntu下是vi etc vsftpd conf在centos 下是vi etc vsftpd vsftpd conf这个在不同的系统下可能不同原理一样 找到umask默认是
  • 敏捷之旅大连2013总结回顾

    12月21日 xff0c 敏捷之旅大连站如期召开 xff0c 这是今年我在大连组织的第九次程序员社区活动 xff0c 在此简单总结一下 这次活动考虑到参会人员会比平时多一些 xff0c 所以选择了中山区的比较大的会议室 xff0c 从十二点
  • 1062 Talent and Virtue

    About 900 years ago a Chinese philosopher Sima Guang wrote a history book in which he talked about people 39 s talent an
  • 演说(zhi)之法

    近年来 xff0c 参加了很多各种各样的技术会议 xff0c 在其中也听了很多高手和牛人们的演说 在总结了自己的一些经验之后 xff0c 也会在一些场合和大家分享 在以上的过程中 xff0c 越来越觉得 xff0c 想要为听众们奉献一场精彩
  • 窗体继承,然后实现按钮点击事件的重写

    做了一阵子Winform的程序之后 xff0c 越来越能够做到把窗体 控件等都看作类来对待了 以前做VB的时候 xff0c 对这些控件都是有一种敬畏的心理 xff0c 根本就不敢对其做什么 xff0c 而且当时也的确做不了什么 xff0c

随机推荐

  • 参加百度轻应用编程马拉松总结

    上个周末 xff0c 我到北京参加了百度举办的轻应用编程马拉松大赛 xff0c 感觉非常不错 xff0c 在此总结一下 这是我第一次参加编程马拉松的活动 xff0c 对此充满了好奇也充满了期望 xff0c 更是希望自己以后也能够组织类似的活
  • 前天奶奶来了 xff0c 把屋子里面的东西都收拾了一下 xff0c 尤其是佳佳的玩具 xff0c 有好多毛绒玩具 xff0c 都放在一个柜子的层里面了 早上佳佳醒来 xff0c 发现了新大陆 xff01 美羊羊都碰头了 xff01 维尼的碰
  • 超级简单的抽奖工具

    昨天快到中午的时候接到业务部门的一个需求 xff0c 要求对现有的抽奖软件进行改进 问题是 xff1a 现在的抽奖软件每次只能够抽出一个中奖号码 xff0c 而此次设置的各种奖项的中奖人数加起来有500人 xff0c 如果使用原有的软件 x
  • 程序员应知——把小事做好

    在从事软件开发的这些年中 xff0c 近期越来越多地听到这样的论点 xff1a 当前的程序员越来越浮躁 我的感觉也是如此 xff0c 由于在软件公司中 xff0c 人才流动特别快 xff0c 因此很多人的职位也变化的比较快 xff0c 很可
  • 程序员应知——学习、思考与分享

    有人说 xff0c 程序员是个苦差事 xff0c 一辈子总是要不停地学习 xff0c 学习新的技术 xff0c 学习新的架构 xff0c 学习新的工具 xff0c 一旦一段时间不学习 xff0c 就会发现其他人嘴里冒出来的新鲜词 xff0c
  • Evernote和有道云笔记的比较

    每个人可能都有随手记录一些事情的习惯 xff0c 可能是为了不忘记 xff0c 也可能是随时闪现在头脑中的一些想法 xff0c 因此就有了便利贴 xff0c 而在计算机或者说互联网的时代 xff0c 我们就有了更多选择 xff0c 可以随时
  • 软件开发中的哲学——世界的本原是物质(一)

    在这个系列博客的第一篇中 xff0c 首先要涉及到的哲学原理就是 世界的本原是物质 在IT领域 xff0c 有硬件和软件之分 xff0c 而二者之间的关系 xff0c 就和物质与精神类似 没有硬件的存在 xff0c 那么软件就没有能够发挥作
  • 在Prezi中输入简体中文的完美解决方案

    Prezi是一种在线制作演示文档 xff08 PPT xff09 的工具 xff0c 它与传统的Powerpoint或者Keynote的表现形式完全不同 xff0c 被称为 powerpoint的颠覆者 xff0c 在36Kr上曾经有过多篇
  • 1001 A+B Format

    Calculate a 43 b and output the sum in standard format that is the digits must be separated into groups of three by comm
  • 打印机打印列队中打印状态为错误的解决方式之一

    右键 我的电脑 xff08 win7以上为 计算机 xff09 xff0c 点击 管理 xff0c 展开 服务和应用程序 xff0c 点击 服务 找到右侧的 print spooler 项 xff0c 右键选择 停止 win 43 R打开运
  • Android版DailyInsist(五)——业务逻辑和数据操作SettingFragment & 小结

    最后一部分是提醒以及每天任务刷新 xff0c 两者都用到了 AlarmManager 这个系统管理类 提醒 提醒功能就是一个闹钟的效果 xff0c 只是这里是启动服务 xff0c 在服务里发一条notification作为提醒 设置时间时
  • IDEA项目的结构以及创建

    IDEA的项目结构应该怎么创建 一 在创建项目之前应该先知道IDEA项目的结构二 创建项目的步骤 一 在创建项目之前应该先知道IDEA项目的结构 idea项目的结构由三个部分组成 xff1a 分别是 项目 xff08 project xff
  • python插件安装--

    图像处理 安装opencv方式1 下载opencv xff0c 把cv2 pyd 放到 site packages pycharm ctrl 43 alt 43 s 找到 opencv python 直接安装 点击右下角的应用 Apply
  • RE: 从零开始的车载Android HMI(一) - Lottie

    1 前言 多年以前汽车还是以机械仪表主体的年代 xff0c 各大汽车主机厂商并不十分关注操作系统UI的交互功能 xff0c 但是随着车载SOC算力的不断提高以及主机厂商对汽车座舱竞争的白热化 座舱的HMI在设计上在强调功能性的同时也开始关注
  • Android 车载应用开发与分析(12) - SystemUI (一)

    1 前言 Android 车载应用开发与分析是一个系列性的文章 xff0c 这个是第12篇 xff0c 该系列文章旨在分析原生车载Android系统中核心应用的实现方式 xff0c 帮助初次从事车载应用开发的同学 xff0c 更好地理解车载
  • python 下xml和dict相互转化,含attributes

    from lxml import etree def dictlist node res 61 res node tag 61 xmltodict node res node tag reply 61 reply node tag 61 3
  • Manjaro 系统日常使用入门导引

    Manjaro 系统日常使用入门导引 作者 xff1a 林地宁宁 Arch Linux 简介 常听人说 Arch Linux 系统 xff08 以下简称 Arch xff09 是一款自由度极高的 Linux 发行版 xff0c 在维基百科上
  • SecureCRT产生log日志

    SecureCRT产生log日志 打开一个串口 xff0c 第一步 xff1a 第二步 xff1a 在这一步 xff0c 需要选择合适的端口号和波特率等 第三步 xff1a 选择 34 properties 34 第四步 xff1a 找到
  • 架构设计:生产者/消费者模式

    0 xff1a 概述 今天打算来介绍一下 生产者 xff0f 消费者模式 xff0c 这玩意儿在很多开发领域都能派上用场 由于该模式很重要 xff0c 打算分几个帖子来介绍 今天这个帖子先来扫盲一把 如果你对这个模式已经比较了解 xff0c
  • 1013 Battle Over Cities

    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