当前位置: 首页 > news >正文

每周题解:繁忙的都市

题目链接

繁忙的都市

题目描述

城市 C 是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造。城市 C 的道路是这样分布的:城市中有 n n n 个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道路相连接。这些道路是双向的,且把所有的交叉路口直接或间接的连接起来了。每条道路都有一个分值,分值越小表示这个道路越繁忙,越需要进行改造。但是市政府的资金有限,市长希望进行改造的道路越少越好,于是他提出下面的要求:

  1. 改造的那些道路能够把所有的交叉路口直接或间接的连通起来。
  2. 在满足要求 1 的情况下,改造的道路尽量少。
  3. 在满足要求 1、2 的情况下,改造的那些道路中分值最大的道路分值尽量小。

任务:作为市规划局的你,应当作出最佳的决策,选择哪些道路应当被修建。

输入格式

第一行有两个整数 n , m n,m n,m 表示城市有 n n n 个交叉路口, m m m 条道路。

接下来 m m m 行是对每条道路的描述, u , v , c u, v, c u,v,c 表示交叉路口 u u u v v v 之间有道路相连,分值为 c c c

输出格式

两个整数 s , m a x s, \mathit{max} s,max,表示你选出了几条道路,分值最大的那条道路的分值是多少。

样例 #1

样例输入 #1

4 5
1 2 3
1 4 5
2 4 7
2 3 6
3 4 8

样例输出 #1

3 6

提示

数据范围及约定

对于全部数据,满足 1 ≤ n ≤ 300 1\le n\le 300 1n300 1 ≤ c ≤ 1 0 4 1\le c\le 10^4 1c104 1 ≤ m ≤ 8000 1 \le m \le 8000 1m8000

算法思想

根据题目描述,道路改造后所有交叉路口依然保持连通,改造的道路尽量少,并且改造的那些道路中分值最大的道路分值尽量小。

为了保证改造后依旧是连通的,可以在图中生成一棵树,也就是选择 n − 1 n-1 n1条边使图依然保持连通,并且此时改造的道路最少。

那么如何保证分值最大的那条道路分值尽量小呢?这里有两种思路。

二分答案

求分值最大的那条道路分值最小,通常可以用二分答案来解决。基本思想是:

  • 对所有边按边权从小到大排序
  • 1 ∼ m 1\sim m 1m中选择中间位置 m i d mid mid,检查用 1 ∼ m i d 1\sim mid 1mid的所有边能否将 n n n个交叉路口连接起来
    • 如果能够连通,再到 1 ∼ m i d 1\sim mid 1mid查找答案
    • 否则不能连通,再到 m i d + 1 ∼ m mid+1\sim m mid+1m查找答案

检查过程中,可以使用并查集的思想来统计连通块中点的个数,判断是否通过若干条边将 n n n个点连接起来。

时间复杂度

将所有边排序的排序时间复杂度为 O ( m l o g m ) O(mlogm) O(mlogm),二分答案的时间复杂度为 O ( m l o g m ) O(mlogm) O(mlogm)

代码实现

#include <bits/stdc++.h>
using namespace std;
const int M = 16005;
struct E {int a, b, c;bool operator < (const E &e) const{return c < e.c;}
}e[M];
int n, m, p[M];
int find(int x)
{if(x != p[x]) p[x] = find(p[x]);return p[x];
}
bool check(int mid)
{for(int i = 1; i <= mid; i ++) p[i] = i; //并查集初始化int cnt = 1; //连通块中的点数初始化为1for(int i = 1; i <= mid; i ++){int a = e[i].a, b = e[i].b, c = e[i].c;a = find(a), b = find(b);if(a != b) //如果a和b不连通,则将它们连通起来{p[a] = b;cnt ++; //连通块的点数+1}}return cnt == n; //如果连通块中的点数为n,说明所有点连通起来了
}
int main()
{cin >> n >> m;for(int i = 1; i <= m; i ++){int a, b, c;cin >> a >> b >> c;e[i] = {a, b, c};}sort(e + 1, e + m + 1);int L = 1, R = m;while(L < R){int mid = (L + R) / 2;if(check(mid)) R = mid;else L = mid + 1;}cout << n - 1 << " " << e[L].c << endl;return 0;
}

最小生成树

与一般意义的(所有边权和最小的)最小生成树不同,本题中要求的是最大的边权最小的最小生成树。考虑使用Kruskal算法求最小生成树的基本思想:

  • 将所有边按边权从小到大排序
  • 从小到大依次枚举每条边, a , b , c a, b, c a,b,c,其中边权为 c c c
    • 如果 a a a b b b已经连通,那么直接跳过
    • 如果 a a a b b b不连通,那么就将当前边选出来,将 a a a b b b纳入一个连通块
  • 当所有点都在同一个连通块时,最小生成树建立完毕。

在这个过程中,由于边权是按从小到大排序的,因此连通最后一个点所使用的边,就是生成树中边权最大的边。

由此可见,Kruskal 算法求出的最小生成树,不但总权值和最小,而且最大边的边权一定是所有的生成树最大边中最小的。

时间复杂度

将所有边排序的排序时间复杂度为 O ( m l o g m ) O(mlogm) O(mlogm),Kruskal时间复杂度为 O ( m ) O(m) O(m)

代码实现

#include <bits/stdc++.h>
using namespace std;
const int M = 16005;
struct E {int a, b, c;bool operator < (const E &e) const{return c < e.c;}
}e[M];
int n, m, p[M];
int find(int x)
{if(x != p[x]) p[x] = find(p[x]);return p[x];
}int main()
{cin >> n >> m;for(int i = 1; i <= m; i ++){int a, b, c;cin >> a >> b >> c;e[i] = {a, b, c};}sort(e + 1, e + m + 1);for(int i = 1; i <= m; i ++) p[i] = i;int ans;for(int i = 1; i <= m; i ++){int a = find(e[i].a), b = find(e[i].b), c = e[i].c;if(a != b) {p[a] = b;ans = c;}}cout << n - 1 << " " << ans << endl;return 0;
}

相关文章:

每周题解:繁忙的都市

题目链接 繁忙的都市 题目描述 城市 C 是一个非常繁忙的大都市&#xff0c;城市中的道路十分的拥挤&#xff0c;于是市长决定对其中的道路进行改造。城市 C 的道路是这样分布的&#xff1a;城市中有 n n n 个交叉路口&#xff0c;有些交叉路口之间有道路相连&#xff0c;两…...

linux之防火墙工具

netfilter Linux防火墙是由Netfilter组件提供的&#xff0c;Netfilter工作在内核空间&#xff0c;集成在linux内核中。 Netfilter在内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING)&#xff0c;而这五个hook function向用户…...

【Python】—— 高阶函数

目录 &#xff08;一&#xff09;体验高阶函数 &#xff08;二&#xff09;内置高阶函数 2.1 map(&#xff09; 2.2 reduce() 2.3 filter() Python中的高阶函数是指那些接受函数作为参数&#xff0c;或者返回函数作为结果的函数。这种特性让Python的函数编程能力非常强大&…...

逻辑分析仪 - 采样率/采样深度

采样深度&#xff08;Sampling Depth&#xff09; 采样深度指的是逻辑分析仪在一次捕获过程中可以记录的最大样本数量。简单来说&#xff0c;采样深度越大&#xff0c;逻辑分析仪可以记录的数据量就越多。这对于分析长时间的信号变化或复杂的信号序列非常重要。 采样率&#…...

【Maven打包将resources/lib/下的jar也打包进jar包中】

Maven打包将resources/lib/下的jar也打包进jar包中 &#xff01;&#xff01;&#xff01;少走弯路 第一步 resources/lib/下引入jar ftp4j-1.7.2.jar替换为自己jar包的名称 <dependency><groupId>it.sauronsoftware.ftp4j</groupId><artifactId>ft…...

基于Java的地震震中附近城市分析实战

目录 前言 一、空间数据说明 1、空间查询 二、Java后台开发 1、模型层设计与实现 2、控制层设计与实现 三、Leaflet地图开发 1、地震震中位置展示 2、附近城市展示 3、成果展示 总结 前言 随着全球气候变化和地壳活动的不断演变&#xff0c;地震作为一种自然灾害&…...

【C语言】指针(三)

目录 一、字符指针 1.1 ❥ 使用场景 1.2 ❥ 有关字符串笔试题 二、数组指针 2.1 ❥ 数组指针变量 2.2 ❥ 数组指针类型 2.3 ❥ 数组指针的初始化 三、数组指针的使用 3.1 ❥ 二维数组和数组名的理解 3.2 ❥ 二维数组传参 四、函数指针 4.1 ❥ 函数的地址 4.2 ❥ 函数…...

【Linux】从零开始认识进程间通信 —— 管道

送给大家一句话&#xff1a; 人要成长&#xff0c;必有原因&#xff0c;背后的努力与积累一定数倍于普通人。所以&#xff0c;关键还在于自己。 – 杨绛 从零开始认识进程间通信 1 为什么要进程间通信2 进程如何通信3 进程通信的常见方式4 管道4.1 什么是管道4.2 管道通信的系…...

Top3专业课150满分,怎么考的?

这个系列会邀请上岸学长学姐进行经验分享~ 今天经验分享的同学是小马哥上海交大819的全程班学员&#xff0c;专业课150分满分&#xff0c;这位同学也是819期末考试的第一名&#xff0c;非常厉害&#xff01;大家吸吸欧气&#xff01; 初试成绩单 前言 先介绍下自己&#xff0…...

Windows Presentation Foundation(WPF)要点总结

Windows Presentation Foundation&#xff08;WPF&#xff09;是微软推出的一种用于构建Windows桌面应用程序的框架。自从WPF在.NET Framework 3.0中引入以来&#xff0c;它以其强大的功能和灵活性&#xff0c;逐渐成为开发人员构建现代、富用户界面应用程序的首选。本文将概述…...

【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法

文章目录 前言 Timer中断调度 Event中断调度 StateFlow调度 分析和应用 总结 参考资料 前言 近期在一些嵌入式系统开发项目中&#xff0c;在使用嵌入式处理器时&#xff0c;遇到了挺多费时费力的事情。所以利用晚上和周末时间&#xff0c;在这些方面深入研究了一下&…...

揭秘Python的魔法:装饰器的超能力大揭秘 ‍♂️✨

文章目录 Python进阶之装饰器详解1. 引言装饰器的概念与意义装饰器在Python编程中的作用 2. 背景介绍2.1 函数作为对象2.2 高阶函数 3. 装饰器基础3.1 理解装饰器3.2 装饰器的工作原理 4. 带参数的装饰器4.1 为什么需要带参数4.2 实现带参数的装饰器使用函数包裹装饰器使用类实…...

怎么一键消除路人?教你三个消除方法

怎么一键消除路人&#xff1f;在数字时代&#xff0c;摄影已成为我们记录生活、表达情感的重要方式。然而&#xff0c;完美的照片背后往往隐藏着一些不那么完美的元素——比如那些不经意间闯入镜头的路人。他们或许只是匆匆过客&#xff0c;但却足以破坏你精心构图的美好瞬间。…...

Android Settings系统属性读写

Settings系统属性存储均为xml&#xff0c;分三种&#xff1a; 1.global&#xff1a;所有的偏好设置对系统的所有用户公开&#xff0c;第三方APP有读没有写的权限&#xff1b; 源码地址&#xff1a;frameworks/base/core/java/android/provider/Settings.java 对应xml路径&…...

2024年,企业的人才管理怎么做?这5点是关键!

当今时代&#xff0c;各行各业都面临着激烈的竞争。这些竞争归根结底都是人才的竞争。企业若想在竞争中掌握主动权&#xff0c;实现基业长青&#xff0c;就必须努力留住人才&#xff0c;并充分发挥他们的积极性、主动性和创造性。因此&#xff0c;做好人才管理是企业实现长期可…...

数据库DDL语句

数据库DDL语句&#xff1a; 查询所有数据库&#xff1a; show databases;查询当前数据库的名称 select database();创建数据库 create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则]注意&#xff1a;排序规则指定后&#xff0c;它会影响…...

《艺术大观》知网艺术刊:可加急, 出刊上网快

《艺术大观》 《艺术大观》征文通知 《艺术大观》期刊诚邀学者、艺术家和文化工作者积极投稿&#xff0c;共同探索艺术领域的前沿问题&#xff0c;促进学术交流和艺术创作的发展。我们欢迎各类艺术形式的研究与评论&#xff0c;包括但不限于绘画、雕塑、音乐、舞蹈、戏剧、电…...

如何在go语言中调用c语言代码

1.安装c语言编译器 要使用cgo&#xff0c;需要安装c语言编译器 gcc 2.检查CGO_ENABLED时候开启 使用以下命令查看&#xff1a; go env CGO_ENABLED 如果go env CGO_ENABLED被禁用(为0),需要将其设置为开启(为1) 3.编写c语言程序&#xff0c;并用go语言调用c语言程序 1&#xff…...

Monodle centerNet3D 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署

一直想做一点3D目标检测&#xff0c;先来一篇单目3D目标检测Monodle&#xff08;基于centernet的&#xff09;&#xff0c;训练代码参考官方【代码】&#xff0c;这里只讲讲如何部署。 模型和完整仿真测试代码&#xff0c;放在github上参考链接【模型和完整代码】。 1 模型训练…...

Android Studio 使用MQTT协议开发应用时怎样关闭MQTT连接

Android Studio 使用MQTT协议开发应用时怎样关闭MQTT连接 Android Studio 使用MQTT协议开发应用时关闭MQTT连接 在使用mqtt开发的时候&#xff0c;有时候需要通过 返回 按钮关闭界面或者Activity时&#xff0c;关闭当前页面使用的mqtt连接&#xff0c;这里有两种方式彻底销毁…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...