1013 Battle Over Cities

news2025/1/17 1:11:07

 

目录

Input Specification:

Output Specification:

Sample Input:

Sample Output:

一、题目大意 

二、思路

三、代码 

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

 

一、题目大意 

有N个城市和M条道路,每条道路只包含两端的城市

现给出K种城市被攻陷的情况,每种情况下只有一个城市被攻陷

要求给出每种情况下,让没有被攻陷的城市能够全连通最少需要再修建几条公路

二、思路

1.最好的情况,不需要新修建道路,如下图1(黑色线条代表已存在的道路,红色线条代表被攻陷后无法通行的道路,红色数字表示被攻陷的城市,下同

                                                                 图1

                                                           

2.中枢城市被攻陷,出现若干个分散的城市集合,如下图2

                                                                        图2

                                                             

 

分析:上图中,城市3被攻陷,此时端点含有3的道路全部断开,由此生成了4个分散的城市集合,如下图3

                                                                        图3

                                                               

显而易见,最少需要的道路数量就是 除被攻陷城市外分散的城市集合个数-1

那么解题流程如下:

1.读入原始数据,并生成原始图。

2.将端点含有被攻陷城市的道路切断。

3.统计切断后除被攻陷城市外分散的城市集合个数,减去1后输出

4.重新拷贝原始图后,循环执行2~3

三、代码

#include<bits/stdc++.h>
using namespace std;
#define MAXN 1001

bool vis[MAXN];

void dfs(vector<int> Adj[] , int x);

int main(){
    int N , M , K;
    cin >> N >> M >> K;
    vector<int> init[N + 1];
    for(int i = 0;i < M;i ++){
        int city1 , city2;
        cin >> city1 >> city2;
        //存入初始图
        init[city1].emplace_back(city2);
        init[city2].emplace_back(city1);
    }
    for(int i = 0;i < K;i ++){
        int lost; //被攻陷的城市
        cin >> lost;
        vector<int> Adj[N + 1]; //存放切断道路后的图
        for(int j = 1;j <= N;j ++){
            if(j != lost){  
                Adj[j] = vector<int>(init[j]); //不要放入被攻陷的城市
            }
        }
        for(int j = 1;j <= N;j ++){
            if(j != lost){
                auto it = find(Adj[j].begin() , Adj[j].end() , lost); 
                //如果当前城市与被攻陷的城市之间有道路
                if(it != Adj[j].end()){
                    //把和被攻陷城市连通的道路放到末尾并切断
                    swap(*it , *(Adj[j].end() - 1));
                    Adj[j].pop_back();
                }
            }
        }
        int connect_num = 0; //分散的城市集合的数量
        vector<int> isConnect; //用来存放已经记录过的城市,或是与已经记录过的城市连通的城市
        for(int j = 1;j <= N;j ++){
            if(j != lost){
                //若当前城市还没有被记录,且不是被攻陷的城市
                if(find(isConnect.begin() , isConnect.end() , j) == isConnect.end()){
                    int flag = 0; //判断是否全连通
                    memset(vis , false , N + 1); //初始化访问
                    dfs(Adj , j); //从当前城市开始访问
                    for(int k = 1;k <= N;k ++){
                        if(k != lost){
                            if(!vis[k]){
                                flag = 1;
                            }else{
                                isConnect.emplace_back(k); //将已经访问的城市记录。
                            }
                        }
                    }
                    if(flag == 1){
                        //若没有全连通,则说明从该城市出发是一个未被记录的分散城市集合
                        connect_num ++; 
                    }
                }
            }
        }
        printf("%d\n" , connect_num == 0 ? 0 : connect_num - 1);
    }
    
    return 0;
}

void dfs(vector<int> Adj[] , int x){
    vis[x] = true;
    for(int i = 0;i < Adj[x].size();i ++){
        int v = Adj[x][i];
        if(!vis[v]){
            dfs(Adj , v);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/23928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

138.深度学习分布式计算框架-1

138.1 PaddlePaddle PaddlePaddle是百度开源的一个深度学习平台PaddlePaddle为深度学习研究人员提供了丰富的API&#xff0c;可以轻松地完成神经网络配置&#xff0c;模型训练等任务。官方文档中简易介绍了如何使用框架在 线性回归识别数字图像分类词向量个性化推荐情感分析语…

2.14 分享9个高吸睛小红书首图制作技巧,要认真学哦!【玩赚小红书】

在小红书里&#xff0c;推荐的图片比例是3:4、1:1、4:3。 做图的时候就要提前调整好比例&#xff0c;免得上传被自动裁剪掉重要信息。竖屏最常用&#xff0c;因为比较“霸屏”&#xff0c;展现的信息空间比较大。当然&#xff0c;选哪个比例还是看个人偏好&#xff0c;尽量保持…

2022年C++面试题万余字汇总【面试官常问】

2022年C面试题【常问重点问题】1、请你说说 GET 和 POST 的区别&#xff1f;2、简述一下 C 中的多态?3、说一说进程有多少种状态&#xff0c;如何转换?3、请你说说指针和引用的区别4、简述一下虚函数的实现原理5、说一说 vector 和 list 的区别&#xff0c;分别适用于什么场景…

剪映PC版英文字幕翻译最新方法(中英互译)

原文地址 剪映PC版英文字幕翻译最新方法&#xff08;中英互译&#xff09; – 方包博客 – java|python|前端开发|运维|电商|ui设计剪映PC版英文字幕翻译最新方法&#xff08;中英互译&#xff09;https://www.fang1688.cn/ziyuan/3431.html 我的是剪映 v3.3.0版本。旧版不支持…

Omorn - NJ301-1100 AND NX102-9000 - CIP - UCMM 通讯

目录 Omorn - NJ301-1100 AND NX102-9000 - CIP - UCMM 通讯 测试案例IP 创建变量类型 指令编写加数据测试 Omorn - NJ301-1100 AND NX102-9000 - CIP - CLASS3 通讯 Omorn - NJ301-1100 AND NX102-9000 - CIP - UCMM 通讯 说明&#xff1a; 1、NJ的网络通讯指令要有CIP…

【C语言入门数据结构】顺序表

&#x1f648;个人主页&#xff1a;阿伟t &#x1f449;系列专栏&#xff1a;【C语言–大佬之路】 &#x1f388;今日心语&#xff1a;你所看到的惊艳&#xff0c;都曾被平庸所历练。 前言&#xff1a;继【时间复杂度和空间复杂】度之后&#xff0c;本章我们来介绍数据结构中…

docker能干什么以及基本名词解释

docker能干什么以及基本名词解释 docker能干什么&#xff1f;比较docker和虚拟机的不同DEVOps (开发&#xff0c;运维)基本名词解释docker能干什么&#xff1f; 比较docker和虚拟机的不同 传统虚拟机&#xff0c;虚拟出一条硬盘&#xff0c;然后再这个系统上安装和运行软件。…

1.3-1.7 测度理论

测度理论 (Durrett) 第五版 个人笔记 答案 Durrett高等概率论教材 (Probability) 攻读概率及统计/机器学习应用方向博士学位. 1. Measure Theory Probability SpacesDistributionsRandom VariablesIntegrationProperties of the IntegralExpected ValueProduct Measures, Fub…

python实现科研通定时自动签到

1 新建虚拟环境 python -m venv venv2 激活环境 3 官网下载edgedriver.exe Edge WebDriver链接在此&#xff0c;下载对应的浏览器的版本&#xff0c;然后改名为msedgedriver.exe放在\venv\Scripts下面。 main.py代码如下&#xff1a; from selenium import webdriver from…

动态规划——完全背包问题(C++实现)

题目描述&#xff1a; 问题分析&#xff1a; 完全背包问题和01背包问题的不同点&#xff1a; 简单01背包中是从N个物品里选&#xff0c;每个物品只能用1次&#xff0c;完全背包则不同&#xff0c;每个物品可以用无限次。 01背包&#xff1a; 如果物品能放入背包&#xff08…

PIC单片机1——按钮测试

#include "p18f458.h" #define Button PORTBbits.RB0 #define Led PORTCbits.RC0 void delay() { unsigned char i,j; for(i0;i<255;i) for(j0;j<255;j) ; } void main() { TRISBbits.TRISB01;//B0输入 TRISCbits.TRISC00;//C0输出 Led1;…

[计算机毕业设计]大数据疫情分析与可视化系统

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

Unload data from Databend | 新手篇(4)

上篇我们讲了怎么利用 copy 命令借助于 Stage 把数据加载到 Databend 中&#xff0c;Databend 致力于构建一个完整的数据湖&#xff0c;也需要支持用户把数据从 Databend 中取走&#xff0c;这里 Databend 给三种可以把数据取走的办法&#xff1a; External table 把数据存储在…

fiddler使用教程

Fiddler教程 Fiddler简介 Fiddler是一款网络代理调试工具&#xff0c;可以将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作&#xff0c;是目前最常用的http抓包工具之一。 Fiddler工作原理 Fiddler通过改写HTTP代理&#xff0c;来监控并截取数据。当浏览器访…

2022年第十二届APMCM亚太地区大学生数学建模竞赛--思路代码

2022年第十二届APMCM亚太地区大学生数学建模竞赛--思路&代码报名时间节点往年真题赛题&翻译题目思路A题——赛题解读&解题思路B 题——赛题解读&解题思路C题——赛题解读&解题思路报名 官方网址&#xff1a;http://www.apmcm.org 报名网址&#xff1a;http…

Similarity and Matching of Neural Network Representations 论文阅读笔记

这是NIPS2021的一篇论文&#xff0c;文章主要是探究了通过一个stiching layer将两个已训练的不同初始化的相同结构的网络的某一层进行匹配的可能性。 前言 作者对 “什么情况下两个表征是相似的&#xff1f;” 提出了一个新的问题&#xff1a;“如果我们知道两个表征是相似的&…

Qt 停靠布局QDockWidget使用

基本使用 QDockWidget是一个可以停靠在QMainWindow内的窗口控件&#xff0c;它可以保持浮动状态或在指定位置作为子窗口附加到主窗口中。停靠窗口QDockWidget类是应用程序中经常用到的&#xff0c;设置停靠窗口的一般流程如下。 创建一个QDockWidget对象的停靠窗体。设置此停…

Kafka是什么?Rocket MQ在Spring Boot中怎么整合使用/Kafka在SpringBoot中简单配置使用

写在前面&#xff1a; 继续记录自己的SpringBoot学习之旅&#xff0c;这次是SpringBoot应用相关知识学习记录。若看不懂则建议先看前几篇博客&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 3.5.4.5 SpringBoot整合RocketMQ 3.5.4.5.1 Rocket…

怎么设计个性时尚的班服?一起来看看莱佛士学生的设计

校园时期&#xff0c;每个学生其实都拥有一次做“设计师”的经历&#xff0c;那就是为自己的班集体设计班服&#xff01; 莱佛士设计学院就曾与新加坡国立大学Yong Loo Lin 医学院合作&#xff0c;进行过一场别开生面的校园文创设计大赛&#xff0c;其中不仅有班服设计&#x…

【iOS开发】-UIPickerView

写在开头 昨天学习了iOS一个简单的控件。 UIPickerView; UIPickerView组件类似HTML都Select组件效果&#xff0c;提供数据供用户选择。可以通过plist文件提供数据。UIPickerView是一个选择器控件&#xff0c;可以生成单列的选择器&#xff0c;也可以生成多列的选择器&#xff…