【PAT甲级题解记录】1013 Battle Over Cities (25 分)

news/2024/7/20 22:21:02 标签: 深度优先, 算法, c++, 图的遍历, 连通图

【PAT甲级题解记录】1013 Battle Over Cities (25 分)

前言

Problem:1013 Battle Over Cities (25 分)

Tags:DFS 连通图

Difficulty:剧情模式 想流点汗 想流点血 死而无憾

Address:1013 Battle Over Cities (25 分)

问题描述

给出一个城市和公路的连通图(虽然题目里没有明确说明),城市编号1-N。

每一次询问都独立输入一个城市编号,求删去这个城市后需要至少加几条路使得连通图成立。

解题思路

其实就是求连通分量数量,想了想试了试没有想到很巧妙的方法,那还是用搜索稳一点:以每个城市为起点开一个dfs,如果被搜索过就直接跳过,最后开了几个dfs就是几个连通分量。

  1. 首先维护一个访问集合inMap,保存访问到的城市,
  2. 当失去一个城市后,以每个未被访问过的城市为起点进行dfs,将dfs到的城市归入集合inMap。(所以之后再遍历到该城市就不会再dfs了)
  3. 当我们开始一系列的dfs时对ans累加1(说明这是一个被隔开的城市),ans最终的值说明了有多少个连通分量,ans-1就是要修的公路数量(N个连通分量只需要N-1条路径来实现整张图的连通)

参考代码

#include<iostream>
#include<vector>
#include<set>

using namespace std;
int N, M, K;
vector<vector<int>> edges; 
set<int> inMap; // 用于确认某个城市是否已被搜索
int occupied_city;

void init() {
    cin >> N >> M >> K;
    edges.resize(N + 1);
    for (int i = 0; i < M; i++) {
        int city1, city2;
        cin >> city1 >> city2;
        edges[city1].push_back(city2);
        edges[city2].push_back(city1);
    }
}

void dfs(int root) {
    inMap.insert(root);
    int num = edges[root].size();
    for (int i = 0; i < num; i++) {
        int next_city = edges[root][i];
        if (inMap.count(next_city) == 0) {
            dfs(edges[root][i]);
        }
    }
}

void solve() {
    inMap.clear(); // 每次查询都需清空集合
    int ans = 0; // 连通分量数量
    cin >> occupied_city;
    inMap.insert(occupied_city);
    for (int i = 1; i <= N; i++) {
        if (inMap.count(i) || i == occupied_city) continue;
        dfs(i);
        ans++;
    }
    cout << ans - 1 << endl;

}

void solution_1013() {
    init();
    for (int i = 0; i < K; i++) {
        solve();
    }
}
int main() {
    solution_1013();
    return 0;
}

总结

关于图的连通等问题,用DFS解决很常见。


http://www.niftyadmin.cn/n/96110.html

相关文章

支持U盘数据、误删文件、硬盘数据 、回收站数据恢复的软件

好用的Windows数据恢复软件的标准 在数字和信息经济时代&#xff0c;数据是必不可少的。没有人可以承受由于意外删除、格式化和其他原因导致数据丢失的风险。与其在数据恢复服务上花费大量资金或花费大量时间努力自己取回数据&#xff0c;用户更喜欢使用Windows数据恢复软件…

掌握MybatisPlus提升开发效率(二)MybaitsPlus核心类BaseMapper、增删改查实战

文章目录MybaitsPlus核心类BaseMapper类源码案例查询API根据id查询根据id批量查询查询一条记录统计行数查询全部案例新增API插入一条记录案例删除API根据id删除条件删除案例更新APIqueryWrapper更新操作updateWrapper更新操作MybaitsPlus核心类 MybaitsPlus封装了一些CRUD的接…

CFS三层内网渗透

目录 环境搭建 拿ubuntu主机 信息收集 thinkphp漏洞利用 上线msf 添加路由建立socks代理 bagecms漏洞利用 拿下centos主机 msf上线centos 添加路由&#xff0c;建立socks代理 拿下win7主机 环境搭建 设置三块虚拟网卡 开启虚拟机验证&#xff0c;确保所处网段正确&a…

【一看就会】实现仿京东移动端页面滚动条布局

简单粗暴直接上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <meta name"viewport" content&q…

EcoVadis认证评分有变化 请注意

【EcoVadis认证评分有变化 请注意】EcoVadis作为全球众多知名品牌进行供应链风险管控的重要工具之一&#xff0c;最近几年越来越多国内企业被要求参与该项CSR企业社会责任评估。参与评估的企业&#xff0c;包括国内的不少上市公司&#xff0c;对此项目越来越重视&#xff0c;直…

notepad++中使用正则表达式

目录 notepad中使用正则表达式 notepad中正则表达式的语法notepad中常用的正则表达式类notepad中查找窗口的关于正则表达式的参数说明notepad正则表达式不能选择匹配内容notepad正则表达式使用举例 正则表达式提取分隔符前的内容正则表达式替换一个分隔符为换行符删除多余的空…

【微信小程序】-- 常用的基础内容组件介绍 -- text rich-text progress icon(七)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#…

【网络原理8】HTTP构成篇1

在上一篇文章当中&#xff0c;我们也提到了什么是HTTP。 HTTP是一个工作在应用层的协议。每当访问一个网站和app&#xff0c;都会使用到HTTP协议。 下面&#xff0c;聊一下HTTP协议的一些专业术语。 目录 一、URL 第一部分&#xff1a;协议名称 第二部分:认证信息(新的版本…