【算法每日一练]-图论(保姆级教程篇9 最小生成树 ,并查集篇)#道路修建 #兽径管理

目录

题目:道路修建

思路: 

题目:兽径管理

思路:


        

        

题目:道路修建

                

思路: 

“让这些点全部连在一起的最小代价”很明显是最小生成树。绝对不能kruskal,存边一定会超内存。所以只能prim。

但是这些点之间的边我们还是不能存,最好的方式就是一边建树一边计算距离

因为我们每次都要取距离集合最小的点,那么我们就要维护一个dis数组

                

思路是这样的:

集合中的点到集合距离一定是0,

集合外的点到集合的距离一定需要与集合中的每个点的距离进行比较取最小值。

但是如果说集合每变动一次,集合外的点就把集合中的点全部遍历一遍非常没必要。

因为之前已经比较过的点根本就不用再比较,基于这个思想。
我们完全可以在集合中每个元素进入集合的时候进行比较就行,

这样相当于是把新进入集合的元素要和集合外的所有元素进行距离更新即可
计算方式为:dis[j]=min(dis[j],cur到j的距离)
        

#include <bits/stdc++.h>
using namespace std;
int n,cnt;
double sum;
int vis[5005];
double dis[5005],x[5005],y[5005];//dis是每个点到集合的最小距离double cal(double x1,double y1,double x2,double y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 
}
void prim()
{dis[1]=0;vis[1]=1;for(int i=1;i<=n;i++){//一共要n个点全部进入集合int cur=1;double minn=1e9*1.0;for(int j=1;j<=n;j++)if(!vis[j]&&dis[j]<minn){//获取最近点minn=dis[j];cur=j;}vis[cur]=1;sum+=dis[cur];for(int j=1;j<=n;j++){if(!vis[j])dis[j]=min(dis[j],cal(x[cur],y[cur],x[j],y[j]));}}printf("%.2lf",sum);
}int main()
{cin>>n;for(int i=1;i<=n;i++){scanf("%lf%lf",&x[i],&y[i]);;//输入每个点的坐标dis[i]=1e12*1.0;}prim();
}

        

        

        

题目:兽径管理

        

思路:

这么长的题你应该也不会读,我捋一下:

牛群希望能够在任意两块草地间移动,草地编号1~n,共w周牛群每周发现一个新路,输出每周任意两块草地路径总和,如果不能到达就输出-1。

                

这道题本来不难的,我花了一下午找bug,结果发现又tm在排序上犯老毛病了!(原数组是有序的)别学我啊

        
原来的边是按照时间顺序的,现在一排序就不知道原来的出现时间了,那么就需要增加一个id记录出现时间,也是边原来的标号。

        
第一种解法是每周跑一次,kruskal时间晚于本周的边不统计
第二种解法是倒着进行kruskal。在最后一周跑的kruskal上统计用到的边,每往前一周删一条边,如果这条边没有被用到,那么使用上个结果,否则重跑。
        

         

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=205,M=6005;
int f;
struct Edge{ int u,v,w,id; }e[M];
int fa[N],n,m;
int use[M],vis[M];//vis表示被删掉的边,use表示在上次结果中被用到的边
ll ans[M];bool cmp(Edge a,Edge b){ return a.w<b.w;}void init(){for(int i=1;i<=n;i++) fa[i]=i;//初始化并查集节点memset(use,0,sizeof(use));
}
int find(int x)
{if(x!=fa[x]) fa[x]=find(fa[x]);return fa[x];//返回祖先 
}ll kruskal()
{init();ll tmp=0;int cnt=0;for(int i=1;i<=m;i++){if(vis[e[i].id])continue;//此边要判断边的id是否已经被删掉了int fu=find(e[i].u), fv=find(e[i].v);if(fu==fv) continue;  //若出现两个点已经联通了,则说明这一条边不需要了tmp+=e[i].w; //将此边权计入答案use[e[i].id]=1;//对id标记fa[fv]=fu; //合并操作if(++cnt==n-1)break;}return cnt==n-1?tmp:-1;
}int main()
{cin>>n>>m;for(int i=1;i<=m;i++){scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].w);e[i].id=i;//记录边的id号}sort(e+1,e+1+m,cmp);//将边的权值排序ans[m]=kruskal();for(int i=m-1;i>0;i--){//从id开始删边,倒着删边嘛vis[i+1]=1;//对id号删除if(use[i+1]) ans[i]=kruskal();//id被用过else ans[i]=ans[i+1];if(ans[i]==-1){for(int j=1;j<i;j++) ans[j]=-1;break;}}for(int i=1;i<=m;i++)cout<<ans[i]<<'\n';return 0;
}

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

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

相关文章

解读免费化潮流:为何数据可视化软件向免费迈进?

近年来&#xff0c;我们见证了数据可视化软件呈现出明显的免费化趋势。这个趋势的背后隐藏着许多关键原因&#xff0c;影响着整个数据行业的发展和走向。为何数据可视化软件开始朝着免费方向发展&#xff1f;让我们一同深入探讨。 普及数字化需求&#xff1a; 数字化已经深入到…

力扣283题 移动零 双指针解法

移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出…

windows下使用iperf3

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、使用步骤1.下载2.解压3.测试1.作为服务器使用2.作为客户端使用 总结 前言 windows使用iperf3和linux是一样的&#xff0c;而且可以相互操作。 一、使用步骤…

Linux系统iptables扩展

目录 一. iptables规则保存 1. 导出规则保存 2. 自动重载规则 ①. 当前用户生效 ②. 全局生效 二. 自定义链 1. 新建自定义链 2. 重命名自定义链 3. 添加自定义链规则 4. 调用自定义链规则 5. 删除自定义链 三. NAT 1. SNAT 2. DNAT 3. 实验 ①. 实验要求 ②. …

mybatis关于namespace以及id以及Mapper接口命名的说明(了解)

1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUES("tom",200.33); INSERT INTO…

C/C++转义符:\x

文章目录 什么是转义符使用"\x"定义char数组宏定义中的\ 什么是转义符 在C语言中&#xff0c;转义符用于将一些特殊字符表示为单个字符&#xff0c;常用的转义符有&#xff1a; \\&#xff1a;反斜杠符号\&#xff1a;单引号\"&#xff1a;双引号\a&#xff1…

如何获取1688的订单详情

获取1688订单详情需要申请 第一步&#xff1a;先去1688-开放平台申请&#xff0c;申请不一定能通过&#xff0c;审批很严。 第二步&#xff1a;首次登录请先注册&#xff0c;注册成功后即可登录。 第三步&#xff1a;选择&#xff1a;我是第三方开发者 第三方是封装好的ap…

解析编程中的技术迷题:常见挑战与应对策略

前言 在数字化时代的浪潮中&#xff0c;编程已经成为了一项至关重要的技能。无论是在软件开发、数据分析、人工智能还是互联网领域&#xff0c;编程都扮演着不可或缺的角色。作为一种创造性的活动&#xff0c;编程不仅仅是代码的书写&#xff0c;更是一种解决问题和创新的思维方…

.Net 8 Blazor下 Auto交互渲染模式试用

一、环境 C:\Users\zhuji>dotnet --version 8.0.100C:\Users\zhuji>dotnet --list-sdks 5.0.403 [C:\Program Files\dotnet\sdk] 6.0.404 [C:\Program Files\dotnet\sdk] 8.0.100 [C:\Program Files\dotnet\sdk] Microsoft Visual Studio Enterprise 2022 (64 位) - Cu…

Jmeter进阶使用:BeanShell实现接口前置和后置操作!

一、背景 我们使用Jmeter做压力测试或者接口测试时&#xff0c;除了最简单的直接对接口发起请求&#xff0c;很多时候需要对接口进行一些前置操作&#xff1a;比如提前生成测试数据&#xff0c;以及一些后置操作&#xff1a;比如提取接口响应内容中的某个字段的值。举个最常用…

【Java学习笔记】75 - 算法优化入门 - 马踏棋盘问题

一、意义 1.算法是程序的灵魂&#xff0c;为什么有些程序可以在海量数据计算时&#xff0c;依然保持高速计算? 2.拿老韩实际工作经历来说&#xff0c;在Unix下开发服务器程序&#xff0c;功能是要支持上千万人同时在线&#xff0c;在上线前&#xff0c; 做内测&#xff0c;一…

软著项目推荐 深度学习 植物识别算法系统

文章目录 0 前言2 相关技术2.1 VGG-Net模型2.2 VGG-Net在植物识别的优势(1) 卷积核&#xff0c;池化核大小固定(2) 特征提取更全面(3) 网络训练误差收敛速度较快 3 VGG-Net的搭建3.1 Tornado简介(1) 优势(2) 关键代码 4 Inception V3 神经网络4.1 网络结构 5 开始训练5.1 数据集…

轻盈未来:气膜建筑的绿色时尚

随着可持续发展理念的日益深入人心&#xff0c;建筑行业也在不断追求绿色、环保的设计与施工方案。气膜建筑&#xff0c;作为一种创新而轻盈的设计理念&#xff0c;正在走在绿色时尚的前沿。本文将探讨气膜建筑的独特之处以及其如何与环保理念相结合&#xff0c;领航着未来建筑…

计算机网络:应用层(下篇)

文章目录 前言一 、电子邮件&#xff08;Email&#xff09;1.邮件服务器2.SMTP[RFC 2821]3.邮件报文格式4.邮件访问协议 二、DNS&#xff08;域名系统&#xff09;1.DNS的历史2.DNS总体思路和目标&#xff08;1&#xff09;问题1&#xff1a;DNS名字空间&#xff08;2&#xff…

C语言:有一篇文章,共三行文字,每行有80个字符。要求分别统计出单词个数、空格数。

分析&#xff1a; #include<stdio.h>&#xff1a;这是一个预处理指令&#xff0c;将stdio.h头文件包含到程序中&#xff0c;以便使用输入输出函数。 int main()&#xff1a;这是程序的主函数&#xff0c;是程序执行的入口点。 char a[3][80];&#xff1a;定义了一个二维…

APP测试的测试内容有哪些,常见的Bug分类介绍!

对于产品的手机项目&#xff08;应用软件&#xff09;&#xff0c;主要是进行系统测试。而针对手机应用软件APP的系统测试&#xff0c;我们通常从如下几个角度开展&#xff1a;功能模块测试、兼容性测试、安装和卸载测试、软件更新测试、性能测试、用户体验性测试、交叉事件测试…

Vmware虚拟化引擎开启

VMware虚拟化引擎开启可以优化虚拟机性能和安全性&#xff0c;但总会出现打开后报错的情况&#xff0c;需要按以下步骤设置处理。 通过任务管理器查看CPU是否已经启用虚拟化 在启用或关闭windows功能中去掉和虚拟化配置相关的功能项后重启 在VMware中选择需要的虚拟化引擎&…

二叉树题目:祖父结点值为偶数的结点和

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;祖父结点值为偶数的结点和 出处&#xff1a;1315. 祖父结点值为偶数的结点和 难度 5 级 题目描述 要求 给定二…

免杀原理(php)

免杀原理 0x01 前言 何为免杀&#xff0c;免杀就是一种逃脱杀毒软件查杀的方法&#xff0c;免杀的目的就是绕过“墙”&#xff0c;去执行危险的操作。那么如何绕过这堵“墙”&#xff0c;就是免杀的本质。有句俗话说得好“知己知彼&#xff0c;百战不殆”&#xff0c;想要用好…

[Android]AlertDialog对话框

1.介绍AlertDialog AlertDialog是Android中常用的对话框组件之一&#xff0c;用于在应用程序中显示一些提示信息、警告、确认信息或者提供用户进行选择的界面。AlertDialog通常用于与用户进行交互&#xff0c;例如要求用户确认某个操作、输入一些信息或者从一组选项中选择一个。…