练习题解(关于最小生成树)

目录

1.【模板】最小生成树

2.无线通讯网

3.拆地毯

4.营救


1.【模板】最小生成树

P3366 【模板】最小生成树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz

输入格式

第一行包含两个整数 N,M,表示该图共有 N 个结点和 M 条无向边。

接下来 M 行每行包含三个整数Xi​,Yi​,Zi​,表示有一条长度为 Zi​ 的无向边连接结点 Xi​,Yi​。

输出格式

如果该图连通,则输出一个整数表示最小生成树的各边的长度之和。如果该图不连通则输出 orz

输入输出样例

输入 #1

4 5
1 2 2
1 3 2
1 4 3
2 3 4
3 4 3

输出 #1

7

数据范围

1≤N≤5000,1≤M≤2×10^5,1≤Zi​≤10^4。

既然说是是模版题,那么我们直接套用Kruskal算法或者Prim算法的,这里我们使用Kruskal算法,如果有不清楚这两种算法的可以看我上一篇作品。

这里我们给出核心函数:

void Kruskal()
{sort(a+1,a+1+m,cmp);for(int i=1;i<=m;i++){int fx=Find(a[i].x);int fy=Find(a[i].y);if(fx==fy) continue;pre[fx]=fy;ans+=a[i].w;cnt++;if(cnt==n-1)break; }
}

利用c++的sort函数将边按照从小到大排序看,便可以完美解决。

下面是完整AC代码:

#include<bits/stdc++.h>
using namespace std;
struct node{int x,y,w;
}a[200010];
int n,m,ans=0,cnt=0;
int pre[6000];
int Find(int x)
{if(pre[x]==x) return x;return pre[x]=Find(pre[x]);
}
bool cmp(node &x,node &y)
{return x.w<y.w;
}
void Kruskal()
{sort(a+1,a+1+m,cmp);for(int i=1;i<=m;i++){int fx=Find(a[i].x);int fy=Find(a[i].y);if(fx==fy) continue;//如果在一个集合就跳过 pre[fx]=fy;ans+=a[i].w;cnt++;if(cnt==n-1)//当加入的边等于顶点数-1,就停止循环 break; }
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++){pre[i]=i;//初始化 }for(int i=1;i<=m;i++){cin>>a[i].x>>a[i].y>>a[i].w;}Kruskal();//进入核心代码 if(cnt==n-1)cout<<ans<<endl;//可以得到答案,直接输出 else cout<<"orz"<<endl;//不可以接通 return 0;
}

2.无线通讯网

P1991 无线通讯网 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

国防部计划用无线网络连接若干个边防哨所。2 种不同的通讯技术用来搭建无线网络;

每个边防哨所都要配备无线电收发器;有一些哨所还可以增配卫星电话。

任意两个配备了一条卫星电话线路的哨所(两边都有卫星电话)均可以通话,无论他们相距多远。而只通过无线电收发器通话的哨所之间的距离不能超过 D,这是受收发器的功率限制。收发器的功率越高,通话距离 D 会更远,但同时价格也会更贵。

收发器需要统一购买和安装,所以全部哨所只能选择安装一种型号的收发器。换句话说,每一对哨所之间的通话距离都是同一个 D。你的任务是确定收发器必须的最小通话距离 D,使得每一对哨所之间至少有一条通话路径(直接的或者间接的)。

输入格式

第一行,2 个整数 S 和 P,S 表示可安装的卫星电话的哨所数,P 表示边防哨所的数量。

接下里 P 行,每行两个整数 x,y 描述一个哨所的平面坐标(x,y),以 km 为单位。

输出格式

第一行,1 个实数 D,表示无线电收发器的最小传输距离,精确到小数点后两位。

数据范围

1≤S≤100,S<P≤500,0≤x,y≤10000。

这道题我一开始没有看懂,到后面经过高人指导才了解,我们需要输出最小的传输距离的前提是这些距离可以联通覆盖所有放哨点,卫星电话就是不管距离多远也可以传输,就不用无线电收发器。

还是使用Kruskal算法,我感觉这道题的边排序与Kruskal算法蛮适合。

看数据范围,P表示放哨所的数量,那我们的边最多是P*P,所以给代表边的结构体数组开范围需要开大一些。

边的长度可以利用数学知识(勾股定理)来求。

double dist(double x1,double y1,double x2,double y2)
{return sqrt(pow(x1-x2,2)+pow(y1-y2,2));
}

其他的就是存边操作。

	for(int i=1;i<=m;i++){for(int j=i+1;j<=m;j++){a[++re].x=i;a[re].y=j;a[re].w=dist(x[i],y[i],x[j],y[j]);}}

下面是完整AC代码。

#include<bits/stdc++.h>
using namespace std;
int pre[600];
struct node{int x,y;double w;
}a[300000];
int x[600],y[600],re;
double ans[300000];
double dist(double x1,double y1,double x2,double y2)
{return sqrt(pow(x1-x2,2)+pow(y1-y2,2));
}
int Find(int x)
{if(pre[x]==x) return x;return pre[x]=Find(pre[x]);
}
bool cmp(node &k1,node &k2)
{return k1.w<k2.w;
}
int main()
{int n,m;cin>>n>>m;for(int i=1;i<=m;i++){cin>>x[i]>>y[i];pre[i]=i;}for(int i=1;i<=m;i++){for(int j=i+1;j<=m;j++){a[++re].x=i;a[re].y=j;//存边 a[re].w=dist(x[i],y[i],x[j],y[j]);}}sort(a+1,a+1+re,cmp);int cnt=0;for(int i=1;i<=re;i++){int fx=Find(a[i].x);int fy=Find(a[i].y);if(fx==fy) continue;pre[fx]=fy;cnt++;if(cnt==m-n)//减去n是因为多出的n可以使用卫星电话 {printf("%.2lf\n",a[i].w);return 0;}}return 0;
} 

3.拆地毯

P2121 拆地毯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

会场上有 n 个关键区域,不同的关键区域由 m 条无向地毯彼此连接。每条地毯可由三个整数 u、v、w 表示,其中 u 和 v 为地毯连接的两个关键区域编号,w 为这条地毯的美丽度。

由于颁奖典礼已经结束,铺过的地毯不得不拆除。为了贯彻勤俭节约的原则,组织者被要求只能保留至多 K 条地毯,且保留的地毯构成的图中,任意可互相到达的两点间只能有一种方式互相到达。换言之,组织者要求新图中不能有环。现在组织者求助你,想请你帮忙算出这至多 K 条地毯的美丽度之和最大为多少。

输入格式

第一行包含三个正整数 n、m、K。

接下来 m 行中每行包含三个正整数 u、v、w。

输出格式

只包含一个正整数,表示这 K 条地毯的美丽度之和的最大值。

输入输出样例

输入 #1

5 4 3
1 2 10
1 3 9
2 3 7
4 5 3

输出 #1

22

数据范围

1<=n,m,k<=100000

这道题其实就是将边的排序改成从大到小,这样才能得到最大美丽度之和。

其他的就和模板体一样。

下面是完整AC代码:

#include<bits/stdc++.h>
using namespace std;
struct node{int x,y,w;
}a[100010];
int n,m,ans=0,cnt=0,k;
int pre[100010];
int Find(int x)
{if(pre[x]==x) return x;return pre[x]=Find(pre[x]);
}
bool cmp(node &x,node &y)
{return x.w>y.w;
}
void Kruskal()
{sort(a+1,a+1+m,cmp);for(int i=1;i<=m;i++){int fx=Find(a[i].x);int fy=Find(a[i].y);if(fx==fy) continue;//如果在一个集合就跳过 pre[fx]=fy;ans+=a[i].w;cnt++;if(cnt==k)//当加入的边kbreak; }
}
int main()
{cin>>n>>m>>k;for(int i=1;i<=n;i++){pre[i]=i;//初始化 }for(int i=1;i<=m;i++){cin>>a[i].x>>a[i].y>>a[i].w;}Kruskal();//进入核心代码 cout<<ans<<endl;return 0;
}

4.营救

P1396 营救 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了 t 区,而自己在 s 区。

该市有 m 条大道连接 n 个区,一条大道将两个区相连接,每个大道有一个拥挤度。小明的妈妈虽然很着急,但是不愿意拥挤的人潮冲乱了她优雅的步伐。所以请你帮她规划一条从 s 至 t 的路线,使得经过道路的拥挤度最大值最小。

输入格式

第一行有四个用空格隔开的 n,m,s,t,其含义见【题目描述】。

接下来 m 行,每行三个整数 u,v,w,表示有一条大道连接区 u 和区 v,且拥挤度为 w。

输出格式

输出一行一个整数,代表最大的拥挤度。

输入输出样例

输入 #1

3 3 1 3
1 2 2
2 3 1
1 3 3

输出 #1

2

数据范围

保证 1≤n≤10^4,1≤m≤2×10^4,w≤10^4,1≤s,t≤n。且从 s 出发一定能到达 t 区。

因为这道题需要的是拥挤度最大值最小,所以我们只需输出当s区与t区联通的时候的拥挤度即可。

下面是完整AC代码:

#include<bits/stdc++.h>
using namespace std;
struct node{int x,y,w;
}a[20010];
int n,m,ans=0,s,e;
int pre[10010];
int Find(int x)
{if(pre[x]==x) return x;return pre[x]=Find(pre[x]);
}
bool cmp(node &x,node &y)
{return x.w<y.w;
}
int  Kruskal()
{sort(a+1,a+1+m,cmp);for(int i=1;i<=m;i++){int fx=Find(a[i].x);int fy=Find(a[i].y);if(fx==fy) continue;//如果在一个集合就跳过 pre[fx]=fy;if(Find(s)==Find(e))//此时两区接通 return a[i].w;//因为已经排好序,所以这时的拥挤度就是最大拥挤度 }
}
int main()
{cin>>n>>m>>s>>e;for(int i=1;i<=n;i++){pre[i]=i;//初始化 } for(int i=1;i<=m;i++){cin>>a[i].x>>a[i].y>>a[i].w;}cout<<Kruskal()<<endl;return 0;
}

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

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

相关文章

【图像拼接】论文精读:A Virtual Reality Video Stitching System Based on Mirror Pyramids

第一次来请先看这篇文章:【图像拼接(Image Stitching)】关于【图像拼接论文精读】专栏的相关说明,包含专栏使用说明、创新思路分享等(不定期更新) 图像拼接系列相关论文精读 Seam Carving for Content-Aware Image ResizingAs-Rigid-As-Possible Shape ManipulationAdap…

TOML格式配置的frp服务搭建

从frp v0.52.0 版本开始&#xff0c;frp 将TOML作为配置文件格式。INI 格式已被弃用&#xff0c;并将在未来的发布中移除。因此&#xff0c;frp v0.52.0 及更高版本的配置文件默认为TOML格式。 项目地址 GitHub&#xff1a;https://github.com/fatedier/frp/releases 服务端…

离线场景下任意文档的在线预览及原样格式翻译,不依赖其他厂商接口非侵入式一行js代码实现网站的翻译及国际化,可配置使用多种翻译语言

离线场景下任意文档的在线预览及原样格式翻译&#xff0c;不依赖其他厂商接口非侵入式一行js代码实现网站的翻译及国际化&#xff0c;可配置使用多种翻译语言。 要实现翻译需要解决以下3个主要问题&#xff1a; 1&#xff09;from&#xff1a;内容本身的语言类型是什么&#xf…

别人还在集五福,星河社区开发者已经奖品拿到手软了!

AI新年新玩法你是否曾为AI应用的神奇而惊叹&#xff1f;你是否想过用AI为你定制新年写真&#xff1f;无需编程&#xff01;&#xff01; 飞桨星河社区帮你实现&#xff0c;还可赢取新年礼包&#xff01; 先速来看看攻略吧&#xff01;页面底部见活动详情。 玩法1攻略&#xff…

Multisim14.0仿真(五十六)74LS76双JK触发器应用设计

一、74LS76简介: 74LS76是 带有独立的 JK 时钟脉冲、直接清除输入和直接设置的双JK触发器。当时钟设置为高电平时,将接收数据

什么是UI设计?

用户界面&#xff08;UI&#xff09;它是人与机器互动的载体&#xff0c;也是用户体验&#xff08;UX&#xff09;一个组成部分。用户界面由视觉设计 (即传达产品的外观和感觉) 和交互设计 (即元素的功能和逻辑组织) 两部分组成。用户界面设计的目标是创建一个用户界面&#xf…

9.0 Zookeeper 节点特性

本章节介绍一下 zookeeper 的节点特性和简单使用场景&#xff0c;正是由于这些节点特性的存在使 zookeeper 开发出不同的场景应用。 1、同一级节点 key 名称是唯一的 实例&#xff1a; $ ls / $ create /runoob 2 已存在 /runoob 节点&#xff0c;再次创建会提示已经存在。 …

缓存异常与一致性

缓存异常&#xff1a; 缓存穿透&#xff1a;请求缓存和数据库都不存在的数据&#xff0c;每次都要查数据库&#xff0c;缓存好像没有起到拦截流量作用。 采用布隆过滤器过滤一定不存在key请求、key逻辑校验&#xff0c;不存在key请求设置缓存key-null布隆过滤器采用多个hash函数…

MySQL:从基础到实践(简单操作实例)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 下载前言一、MySQL是什么&#xff1f;二、使用步骤1.引入库2.读入数据 提交事务查询数据获取查询结果总结 下载 点击下载提取码888999 前言 在现代信息技术的世界…

Java基于微信小程序的医院挂号系统

文章目录 1 简介2 技术栈3 系统目标3.2 系统功能需求分析3.2.1 功能需求分析 4 系统模块设计4.1 数据库模块设计 5 系统的实现5.1 微信小程序个人中心5.2 科**室内容查看的实现**5.3 预约挂号的实现5.4 后台管理界面实现5.5 医生预约管理5.6 医生信息管理 参考文献7 推荐阅读8 …

【C++】类和对象4:日期类的实现(成员函数+运算符重载)

前言 之前我们已经学习了四个默认成员函数&#xff08;构造、析构、拷贝构造、运算符重载&#xff09; 今天我们就来尝试用已经学到的知识进行日期类的完整实现 提示&#xff1a; 依然是分成三个文件来写 只是在讲解的时候就不区分文件了 完整的代码在文章最后 并且之前文章中…

【Git教程】(一)基本概念 ——工作流、分布式版本控制、版本库 ~

Git教程 基本概念 1️⃣ 为什么要用 Git2️⃣ 为什么要用工作流3️⃣ 分布式版本控制4️⃣ 版本库5️⃣ 简单的分支创建与合并&#x1f33e; 总结 在本章中&#xff0c;将介绍一个分布式版本控制系统的设计思路&#xff0c;以及它与集中式版本控制系统的不同之处。除此之外&am…

未来之梦:畅想人工智能操控手机的辉煌时代

引言&#xff1a; 在当今数字化快速发展的时代&#xff0c;人工智能技术正日益深入我们的生活。其中&#xff0c;手机作为人们日常生活不可或缺的一部分&#xff0c;其未来将如何受到人工智能技术的影响&#xff0c;引发了广泛的关注和研究。本文将深入探讨人工智能操控手机的…

区块链大解码:深入了解Web3的核心技术

随着技术的迅速发展&#xff0c;Web3正逐渐崭露头角&#xff0c;成为数字时代的引领者。其中&#xff0c;区块链技术作为Web3的核心&#xff0c;扮演着至关重要的角色。本文将深入解码区块链技术&#xff0c;探讨其在Web3时代的关键作用以及未来发展趋势。 1. 区块链基础原理 …

Windows 10 配置 FFmpeg 使用环境

Windows 10 配置 FFmpeg 使用环境 1.下载FFmpeg 的windows办2. 配置环境变量:3.查看是否配置正确 cmd 或者 PowerShell 执行以下命令 1.下载FFmpeg 的windows办 GitHub 地址 :https://github.com/BtbN/FFmpeg-Builds/releases 解压后得到如图: 2. 配置环境变量: 复制路径:…

java SpringBoot2.7整合Elasticsearch(ES)7 进行文档增删查改

首先 我们在 ES中加一个 books 索引 且带有IK分词器的索引 首先 pom.xml导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>applicatio…

CMake编译JSONCPP库

第一、 JSONCPP 是一个开源的 C 库&#xff0c;用于处理 JSON 数据的解析和生成。您可以在 JSONCPP 的官方网站&#xff08;https://github.com/open-source-parsers/jsoncpp&#xff09;上找到该库的源代码和相关文档。 要使用 JSONCPP&#xff0c;您需要按照以下步骤进行操作…

基于A-Star搜索算法的迷宫小游戏的设计

这篇文章是作者人工智能导论课的大作业&#xff0c;发出来供大家学习参考&#xff08;有完整代码&#xff09;。想要论文WORD文件的可以在本文资源处下载&#xff08;可能还在审核&#xff09;。 摘要&#xff1a; 本文章聚焦于基于A-Star搜索算法的迷宫小游戏设计&#xff0c;…

踩坑实录(Second Day)

作为公司的小菜鸟&#xff0c;每天都踩坑应该是一件很正常的事情吧&#xff0c;哈哈哈。今天遇到了比较棘手的问题&#xff0c;以前从来没有遇到过。然后就是在某平台上接的一个 bug 修改的单子&#xff0c;也拿出来和大家分享一下~ 此为第二篇&#xff08;2024 年 02 月 05 日…

【线程】FutureTask vs. CompletableFuture:解锁异步编程的不同层次(1)

在Java的多线程编程中&#xff0c;FutureTask 和 CompletableFuture 是两个关键的工具&#xff0c;分别代表了基础和进阶的异步编程技术。本文将深入介绍这两者的特点、使用方法以及它们之间的巧妙应用、区别以及各自的优缺点。 1. FutureTask&#xff1a;基础异步任务的引路者…