【算法每日一练]-图论(保姆级教程篇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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

滚珠丝杆在各种自动化设备中的作用

滚珠丝杆因其具有高精度、高刚度和长寿命等特性&#xff0c;成为许多设备中的重要组成部分&#xff0c;在许多行业中都有广泛的应用&#xff0c;接下来我们看看滚珠丝杆的具体应用有哪些&#xff1f; 1、打孔机&#xff1a;提供精确的导向&#xff0c;使打孔机的滑块能够沿固定…

拥抱未来:大语言模型解锁平台工程的无限可能

01 了解大型语言模型 (LLM) 大型语言模型&#xff08;LLM&#xff09;是一种人工智能&#xff08;AI&#xff09;算法&#xff0c;它使用深度学习技术和海量数据集来理解、总结、生成和预测新内容。凭借合成大量信息的能力&#xff0c;LLM 可以提高以前需要人类专家的业务流程的…

todesk连接ubuntu显示当前系统并无桌面环境,或无显示器,无法显示远程桌面,您需要自行安装X11桌面环境,或者使用终端文件功能

ToDesk远程遇到的问题如上图&#xff0c;换向日葵直接黑屏&#xff1b; 问题原因 截止发文时间&#xff0c;Todesk只支持X11协议&#xff0c;没有适配最新的Wayland协议&#xff0c;所以我们需要把窗口系统调整为X11才可以。 解决方法 修改配置文件&#xff0c;关闭wayland su…

精密制造ERP系统包含哪些模块?精密制造ERP软件是做什么的

不同种类的精密制造成品有区别化的制造工序、工艺流转、品质标准、生产成本、营销策略等&#xff0c;而多工厂、多仓库、多车间、多部门协同问题却是不少精密制造企业遇到的管理难题。 有些产品结构较为复杂&#xff0c;制造工序繁多&#xff0c;关联业务多&#xff0c;传统的…

Python (十六) 错误和异常

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

Windows10设置定时提醒

文章目录 Windows10设置定时提醒创建提醒文件新建文本文档修改文件编码和后缀双击测试 创建文件夹创建任务测试运行 Windows10设置定时提醒 创建提醒文件 新建文本文档 修改文件编码和后缀 双击测试 创建文件夹 创建任务 创建触发器 选择程序 测试运行 弹窗正常

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

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

如何使用Qchan搭建更好保护个人隐私的本地图床并在公网可访问

文章目录 前言1. Qchan网站搭建1.1 Qchan下载和安装1.2 Qchan网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar云端设置2.2 Cpolar本地设置 3. 公网访问测试总结 前言 图床作为云存储的一项重要应用场景&#xff0c;在大量开发人员的努力下&#xff0c;已经开发出大…

堆栈_栈实现队列

//请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; // // 实现 MyQueue 类&#xff1a; // // // void push(int x) 将元素 x 推到队列的末尾 // int pop() 从队列的开头移除并返回元素…

Redis多机数据库

文章目录 Redis多机数据库一、主从复制1、旧版复制功能的实现a、同步b、命令传播 2、旧版复制功能的缺陷3、新版复制功能的实现a、部分同步功能b、复制实现步骤 4、心跳检测 二、哨兵1、Sentinel概念2、Sentinel初始化流程3、故障转移过程 三、集群1、几个概念2、集群创建流程a…

C++ day43 最后一块石头的重量 目标和 一和零

题目1&#xff1a;1049 最后一块石头的重量 题目链接&#xff1a;最后一块石头的重量 对题目的理解 整数数组stone[i]表示第i块石头的重量&#xff0c;每次从中选出任意两块石头(x<y)粉碎 如果两块石头重量相等&#xff0c;就会被完全粉碎&#xff1b;如果不等&#xff…

Docker Swarm总结+Jenkins安装配置与集成snarqube和目标服务器(4/5)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

分析某款go端口扫描器之一

一、概述 进来在学go的端口检测部分&#xff0c;但是自己写遇到很多问题&#xff0c;又不知道从何入手&#xff0c;故找来网上佬们写的现成工具&#xff0c;学习一波怎么实现的。分析过程杂乱&#xff0c;没啥思路&#xff0c;勿喷。 项目来源&#xff1a;https://github.com/…

python 基于opencv和face_recognition的人脸识别

python 基于opencv和face_recognition的人脸识别 代码如下&#xff1a; 使用一个photos存放你需要识别的照片&#xff0c;注意一个人一张就行 然后通过下面代码注册用户&#xff0c;之后启动程序&#xff0c;就会调用摄像头进行识别了。 AddPhoto(“发哥”, “./photos/fag…

【yolov5人行道-斑马线目标检测】

yolov5人行道-斑马线目标检测 数据集yolov5人行道-斑马线目标检测检测模型 数据集 YOLOv5是一种目标检测算法&#xff0c;可以用于检测图像中的人行道-斑马线。在目标检测领域&#xff0c;YOLOv5通过结合多种技术手段&#xff0c;包括使用Mosaic数据增强操作、自适应锚框计算与…

TIME_WAIT状态TCP连接导致套接字无法重用实验

理论相关知识可以看一下《TIME_WAIT相关知识》。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<arpa/inet.h> #include<sys/socket.h> #include<errno.h> #include<syslog.h> #inc…

【ArcGIS Pro二次开发】(78):批量合并GDB数据库

有些GDB数据库会按分幅或行政区划进行分开储存&#xff0c;尤其是一些地形测绘或国情地理数据。 如下图所示&#xff1a; 数据是完整的&#xff0c;但使用的时候要一个一个拖进地图中&#xff0c;进行分析的时候也需要将其合并后使用。 因此就做了这个合库工具。 一、要实现的…

直播前期准备

直播前的准备是一个综合性的过程&#xff0c;需要从多个方面进行考虑和准备。以下是一些直播前准备的参考∶ 1.确定直播主题和目标∶明确直播的主题和目标&#xff0c;以及如何吸引观众。考虑观众的兴趣和需求&#xff0c;选择一个熟悉且具有吸引力的主题&#xff0c;以提升直…

字符串相似度匹配算法_莱茵斯坦距离算法

package day0330;public class LevenshteinDistanceUtil {public static void main(String[] args) {String a "WN64 F98";String b "WN64 F98 ";System.out.println("相似度:" getSimilarityRatio(a, b));}/*** 获取两字符串的相似度* * par…

扫码听音乐该如何制作?音乐的二维码生成方法

多个音频文件怎么做成一个二维码显示&#xff1f;二维码在现在的生活中拥有丰富的使用场景&#xff0c;可以用来作为多种内容类型的载体&#xff0c;比如音频二维码就是经常被使用的一种二维码类型。通过扫秒二维码来听音频文件&#xff0c;更加的灵活方便&#xff0c;那么音频…