华为机试 - 城市聚集度

news2025/3/1 21:50:03

目录

题目描述

输入描述

输出描述

用例

题目解析

算法源码


题目描述

一张地图上有n个城市,城市和城市之间有且只有一条道路相连:要么直接相连,要么通过其它城市中转相连(可中转一次或多次)。城市与城市之间的道路都不会成环

当切断通往某个城市 i 的所有道路后,地图上将分为多个连通的城市群,设该城市i的聚集度为DPi(Degree of Polymerization),DPi = max(城市群1的城市个数,城市群2的城市个数,…城市群m 的城市个数)。

请找出地图上DP值最小的城市(即找到城市j,使得DPj = min(DP1,DP2 … DPn))

提示:如果有多个城市都满足条件,这些城市都要找出来(可能存在多个解

提示:DPi的计算,可以理解为已知一棵树,删除某个节点后;生成的多个子树,求解多个子数节点数的问题。

输入描述

每个样例:第一行有一个整数N,表示有N个节点。1 <= N <= 1000。

接下来的N-1行每行有两个整数x,y,表示城市x与城市y连接。1 <= x,  y <= N

输出描述

输出城市的编号。如果有多个,按照编号升序输出。

用例

输入5
1 2
2 3
3 4
4 5
输出3
说明

输入表示的是如下地图:

对于城市3,切断通往3的所有道路后,形成2个城市群[(1,2),(4,5)],其聚集度分别都是2。DP3 = 2。

对于城市4,切断通往城市4的所有道路后,形成2个城市群[(1,2,3),(5)],DP4 = max(3,1)= 3。

依次类推,切断其它城市的所有道路后,得到的DP都会大于2,因为城市3就是满足条件的城市,输出是3。

输入6
1 2
2 3
2 4
3 5
3 6
输出2 3
说明将通往2或者3的所有路径切断,最大城市群数量是3,其他任意城市切断后,最大城市群数量都比3大,所以输出2 3

题目解析

用例1的意思如下:

DPi = max(城市群1的城市个数,城市群2的城市个数,…城市群m 的城市个数)

 题目要求找出地图上DP值最小的城市(即找到城市j,使得DPj = min(DP1,DP2 … DPn)),

因此DP3最小,输出DP3的3。

用例2图示如下

输出2,3。

通过上面两个示例的图示可以发现,其实本题就是求解:图的连通分量。

本题的难点在于,分量关系没有直接给出,需要我们自己推导,其次是需要我们统计出每个连通分量的节点个数。

比如,上面且1的所有联系,则会产生两个连通分量,分别是[1], [4,2,3,5,6],这两个连通分量的节点个数分别为1,5。

求解图的连通分量,我们一般使用并查集。

但是,这里我们不能直接根据输入的连接关系,来产生并查集,因为输入的连接关系没有被切断。

本题是要我们尝试切断每一个城市的连接,因此我们遍历出每一个城市,比如城市2,然后遇到和城市2相关的连接后,我们就跳过并查集的合并操作,这样就能产生切断效果。

我们模拟下用例2

初始时,每个城市的父都是自己

输入的连接关系如下
1 2
2 3
2 4
3 5
3 6

现在我们要切断城市2的所有联系,则遇到和2相关的连接时就不进行合并操作

因此上述连接关系只需要考虑
3 5
3 6

这样的话,最终并查集的合并结果为

可以发现,父为3的连通分量具有最多城市数量

这样的话,我们就可以求解出每个DPi了,最后求其中最小的DP对应i即可。

算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const lines = [];
let n;
rl.on("line", (line) => {
  lines.push(line);

  if (lines.length === 1) {
    n = parseInt(lines[0]);
  }

  if (n && lines.length === n) {
    lines.shift();
    const relations = lines.map((line) => line.split(" ").map(Number));

    console.log(getMinDP(relations, n));

    lines.length = 0;
  }
});

function getMinDP(relations, n) {
  // min用于保存DPj,即城市聚集度
  let min = Infinity;
  // city用于保存j,即城市序号
  let city = [];

  // 遍历每个城市 1~n
  for (let i = 1; i <= n; i++) {
    const ufs = new UnionFindSet(n);
    for (let [x, y] of relations) {
      // 切断城市的所有道路,即忽略和城市i有联系的合并操作
      if (x === i || y === i) continue;
      ufs.union(x, y);
    }

    // 统计各个连通分量自身的城市个数
    const count = {};
    ufs.fa.forEach((f) => {
      count[f] ? count[f]++ : (count[f] = 1);
    });

    // 取最多城市个数作为当前的切断城市的聚集度
    const dp = Object.values(count).sort((a, b) => b - a)[0];

    if (dp < min) {
      min = dp;
      city = [i];
    } else if (dp === min) {
      city.push(i);
    }
  }

  return city.join(" ");
}

/* 并查集 */
class UnionFindSet {
  constructor(n) {
    this.fa = new Array(n + 1).fill(0).map((_, idx) => idx);
    this.count = n;
  }

  find(x) {
    if (x !== this.fa[x]) {
      return (this.fa[x] = this.find(this.fa[x]));
    }
    return x;
  }

  union(x, y) {
    let x_fa = this.find(x);
    let y_fa = this.find(y);

    if (x_fa !== y_fa) {
      this.fa[y_fa] = x_fa;
      this.count--;
    }
  }
}

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

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

相关文章

11月第2周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩)发布!

飞瓜轻数发布2022年11月07日-11月13日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的…

Java#6(类和对象及封装)

目录 一.类和对象基本介绍 1.类:是对象共同特征的描述; 2.对象:是真实存在的具体东西 如何定义类? 对象的定义和使用? 二.封装 原则:对象代表什么,就得封装什么数据,并提供数据对应的行为 1.实例理解 三.Private(私有权限) 一.类和对象基本介绍 1.类:是对象共同特征…

css :first-child 和 :first-of-type

1 :first-child p:first-child {background-color:yellow; }阅读理解&#xff1a;<p>元素的背景设为黄色 第一个子元素的背景设为黄色 父元素的第一个子元素是<p>时&#xff0c;该子元素背景设为黄色 举个栗子&#xff1a; <!DOCTYPE html> <html>…

关于java String类(源码等)分析

String 类 String声明为final &#xff0c;不可以被继承 String 实现了Serializable接口&#xff0c;表明字符串是可序列化的 String 实现了Compareble接口&#xff0c;表示String 可比较大小 String 内部定义了 final char[] value value用于存储字符串数据&#xff0c;表明…

蓝牙耳机什么牌子的好用?口碑比较好的国产蓝牙耳机推荐

对于那些经常戴耳机的人来说&#xff0c;戴上一副舒服的耳机是非常必要的。所以&#xff0c;那些口碑好&#xff0c;佩戴舒适的蓝牙耳机让大多数人都有了很好的体验感。人们之所以如此喜爱蓝牙耳机&#xff0c;一方面是因为其小巧而精致&#xff0c;另一方面则是因为其便于携带…

前端——router路由

1.路由配置 在store文件夹下&#xff0c;新建index.js文件中配置路由 /* vue3中 路由配置 */ //1.path&#xff1a;与vue2中子路由path不带“/”不同的是&#xff0c;vue3这里子路由path带了"/" //这样vue3中路由访问路径也就不是嵌套的&#xff0c;虽然路由配置这…

【深度学习】实验3答案:PyTorch实战——CIFAR图像分类

DL_class 学堂在线《深度学习》实验课代码报告&#xff08;其中实验1和实验6有配套PPT&#xff09;&#xff0c;授课老师为胡晓林老师。课程链接&#xff1a;https://www.xuetangx.com/training/DP080910033751/619488?channeli.area.manual_search。 持续更新中。 所有代码…

Python采集天气数据,做可视化分析【附源码】

知识点: 动态数据抓包requests发送请求结构化非结构化数据解析 开发环境: python 3.8 运行代码pycharm 2021.2 辅助敲代码requests 如果安装python第三方模块: win R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests)回车在pycharm中点击Term…

RocketMQ 5.0 API 与 SDK 的演进

作者&#xff1a; 艾阳坤 RocketMQ 5.0 SDK 采用了全新的 API&#xff0c;使用 gRPC 作为通信层的实现&#xff0c;并在可观测性上做了很大幅度的提升。 全新统一的 API 此处的 API 并不单单只是接口上的定义&#xff0c;同时也规定了各个接口不同的方法和行为&#xff0c;明…

【案例实战】分布式应用下登录检验解决方案(JWT)

文章目录1.需求背景以及JWT简介2.创建Maven项目&#xff0c;搭建SpringBoot项目3.容器化急速部署MySQL4.数据库表准备5.SpringBoot整合MySQLMyBatisPlus6.MyBatisPlus逆向工程自动生成7.SpringBoot整合JWT8.开发测试接口9.开发登录接口10.开发登录拦截器11.启动验证1.需求背景以…

cookie介绍:cookie实现增删改查功能

1、cookie介绍 只能存储文本&#xff0c;只能实现在本地的存储&#xff1b;单条存储有大小限制4kB左右&#xff0c;数量限制&#xff08;一般浏览器&#xff0c;限制大概在50条左右&#xff09;&#xff1b;读取有域名限制&#xff1a;不可跨域读取&#xff0c;只能由来自写入…

集成学习与随机森林

1、集成学习概念 集成学习(ensemble learning)是一类机器学习框架&#xff0c;通过构建并结合多个学习器来完成学习任务。一般结构是&#xff1a;先产生一组“个体学习器”&#xff0c;再用某种策略将它们结合起来。结合策略主要有平均法、投票法和学习法等 集成学习包含三个…

仿大众点评——秒杀系统部分01

秒杀系统 全局ID生成器 全局唯一ID生成策略&#xff1a; UUIDRedis自增snowflake算法数据库自增 这里使用Redis自增的数值&#xff0c;并拼接一些其它信息 Redis自增ID策略&#xff1a; 每天一个key&#xff0c;方便统计订单量ID构造是 时间戳 计数器 ID的组成部分&#…

Unity接入日志插件Log4Net

前言 log4net是一个日志插件&#xff0c;可以帮助我们把控制台输出的日志写入到本地。这个功能说简单就简单&#xff0c;说复杂其实还挺复杂。 为什么这么说呢&#xff0c;首先文件写入本地确实简单&#xff0c;但是如果你要实现一下功能就没那么简单了。 1.把每行日志按照指…

2022年“新一代”设备管理系统——支持低代码平台

在现代化企业的信息化管理体系建设中&#xff0c;设备管理系统被看作是重中之重。因为设备是工厂的主要生产要素&#xff0c;而且随着生产设备的日益增多&#xff0c;设备的重要性日益凸显。如何妥善管理这些设备也成了企业管理者经常考虑的问题。单纯依靠人工管理逐渐不能满足…

uniapp实现下拉刷新及上拉(分页)加载更多(app,H5,小程序均可使用)

开门见山地说&#xff0c;在移动端开发中&#xff0c;80%的项目都会涉及到列表展示&#xff0c;而有了列表不可避免的需求就是列表的下拉刷新和上拉加载更多。本篇文章主要介绍在使用uniapp开发移动端的过程中&#xff0c;比较好用的一个下拉及上拉组件&#xff0c;节约大家选择…

5.2启动内存分页机制,畅游虚拟空间

5.2启动内存分页机制&#xff0c;畅游虚拟空间 即使机器上只有512MB的内存&#xff0c;每个进程自己的内存空间也是4GB&#xff0c;这4GB便是指的虚拟内存空间。下面就是讲解虚拟内存空间是怎么来的。 5.2.1内存为什么要分页 问题场景&#xff1a;由于多进程的发展&#xff…

软考 - 计算机组成与结构

数据计算 数据的进制转化 十六进制符号 0X 或 H&#xff0c;可表示为0x18F 或 18FH m进制转n进制&#xff1a;先将m进制转化为十进制数&#xff0c;再将十进制数转化为n进制数&#xff08;2进制可直接转8进制&#xff08;3位&#xff09;和16进制&#xff08;4位&#xff09…

Python如何自动操作电脑桌面应用程序

前言 本文是该专栏的第2篇,后面会持续分享python的各种黑科技知识,值得关注。 熟悉python的朋友,都知道python可以做自动化,比如说selenium,pyppeteer,airtest等等。 但你是否听说过python可以来自动操作电脑桌面的应用程序呢,趟若临时接到某个需求,让你用python脚本…

基于zynq7100的OV5640摄像头照相机实验,提供工程源码和技术支持

目录1.设计架构2.工程简介3.zynq配置4.sd卡文件系统FATFS配置5.sd卡文件系统FATFS读写测试6.OV5640摄像头显示测试7.OV5640摄像头循环拍照测试8.OV5640摄像头按键拍照测试9.上板调试10.福利领取1.设计架构 设计框图如下&#xff1a; 采用Xilinx官方推荐的VDMA架构实现图像缓存…