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

news2024/11/13 8:58:36

目录

题目:道路修建

思路: 

题目:兽径管理

思路:


        

        

题目:道路修建

                

思路: 

“让这些点全部连在一起的最小代价”很明显是最小生成树。绝对不能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.coloradmin.cn/o/1271778.html

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

相关文章

明基|书客|松下护眼台灯值不值得买?爆款多维度测评揭晓!

随着近视率越来越高的现象&#xff0c;护眼台灯逐渐成为大多数家庭的日常所需&#xff0c;许多护眼台灯品牌为了降低价格吸引消费者而不惜大程度上降低材料品质&#xff0c;导致台灯寿命减短&#xff0c;光线变差等问题频发&#xff0c;这也让广大对于如何选择一款好的护眼台灯…

职业测评链接

职业测评链接&#xff1a; https://www.16personalities.com/ch?utm_sourceresults-turbulent-campaigner&amp%3Butm_mediumemail&amp%3Butm_campaignch&amp%3Butm_contentlogo-0

性能测试线上监控

如果你的产品出现了一个线上问题&#xff0c;你会是怎么样的反应&#xff1f; 也许会跟下面这张图一样。 哇&#xff01;有一个线上bug&#xff0c;好慌呀&#xff01;&#xff01; 咦&#xff0c;问题似乎自动解决了&#xff1f;渐渐冷静。 不对&#xff01;&#xff01;&a…

2023-11-30 AIGC-让图片动起来的主流 AI 工具

摘要&#xff1a; 2023-11-30 AIGC-让图片动起来的主流 AI 工具 让图片动起来的主流 AI 工具 一、数字人播报 1、HeyGen 2、D-ID 3、SadTalker 二、图片生成视频 1、Runway Gen-2 2、Pika Labs 3、Genmo 三、伪3D动态效果 1、LeiaPix 2、剪映手机版 四、角色动画 Animated …

样品实验K-KAT348羧酸铋催化剂TDS说明书

样品实验K-KAT348羧酸铋催化剂TDS说明书 50克 100克 200克

【Axure教程】用中继器制作多选树

“多选树”可能指的是一种用户界面元素&#xff0c;用于展示层级结构并允许用户选择多个节点。这在软件应用程序中常用于设置、文件浏览器等场景。 Axure里面虽然自带了一个树元件&#xff0c;但是并没有多选的功能&#xff0c;所以今天就教大家如何用中继器制作一个多选树的基…

【动态规划】01第 N 个泰波那契数(easy)

题目链接 &#xff1a;leetcode第 N 个泰波那契数 目录 题目解析&#xff1a; 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目解析&#xff1a; 题目让我们求第n个数的泰波那契数。 由题可得&#xff1a; 我们可以把它改写为&#…

唯品会年度特卖大会㊙内购清单㊙

唯品会年度特卖大会㊙内购清单㊙ 内部员工亲友专享&#xff0c;实实在在省钱&#xff0c;❌抢完不补! 今晚8点开抢&#xff0c;提前收藏>> https://t.vip.com/Im3KlTnDSJ8 2023年唯品会年度特卖大会热门会场推荐 1.唯品会年度特卖大会 限时加码!瓜分百万津贴!抢海量…

【UE】简单的警觉系统

效果 步骤 1. 新建一个空白工程&#xff0c;添加第三人称游戏内容包 2. 打开第三人称角色蓝图“BP_ThirdPersonCharacter” 选中弹簧臂组件&#xff0c;将目标臂长度设置为600&#xff0c;z轴方向的插槽偏移设置为100 3. 将“BP_ThirdPersonCharacter”移入场景&#xff0c;该…

学习笔记三十六:通过Ingress-nginx实现灰度发布

通过Ingress-nginx实现灰度发布 灰度发布原理将新版本灰度给部分用户切一定比例的流量给新版本 部署两个版本的服务以 nginx 为例&#xff0c;先部署一个 v1 版本:部署一个 v2 版本再创建一个 Ingress&#xff0c;对外暴露服务&#xff0c;指向 v1 版本的服务:访问验证 基于 He…

C语言——多种方式打印出1000之内的所有的“水仙花数”

所谓水仙花数,是指一个3位数,其各位数字立方和等于该数本身。水仙花数是指一个三位数&#xff0c;它的每个位上的数字的立方和等于它本身。例如&#xff0c;153是一个水仙花数&#xff0c;因为1^3 5^3 3^3 153。 方法一 #define _CRT_SECURE_NO_WARNINGS 1#include <std…

git报错invalid object xxx和unable to read tree xxxxxx

电脑出问题了&#xff0c;导致git仓库像是被损坏了一样&#xff0c;执行git status就会报错unable to read ree&#xff0c;无法正常提交代码至仓库&#xff0c;原因是本地代码仓库.git文件损坏了&#xff0c;无法找到正确的提交历史和路径。 找到了一个解决办法&#xff1a; …

TSINGSEE青犀AI视频智能分析系统的视频接入能力解析

视频智能分析技术是一种先进的人工智能技术&#xff0c;它能够对视频内容进行自动化的分析和理解。这种技术的主要特点包括实时性、自动化、准确性、可解释性等。 1&#xff09;实时性。视频智能分析技术能够在短时间内对大量的视频数据进行快速处理和分析&#xff0c;从而提供…

精彩回顾|迪捷软件先进装备软件技术研讨会之行圆满收官

2023年11月24日&#xff0c;为期3个月的先进装备软件高安全、高可靠、智能化验证技术系列研讨会在成都圆满收官。迪捷软件董事长康烁作为研讨会特邀专家&#xff0c;在西安、上海、成都站进行了演讲分享。 以航空航天、船舶、电力电子、汽车、医疗为代表的先进装备软件发展迅速…

英国人工智能初创公司Stability AI面临卖身压力;深度学习中的检索增强生成简介

&#x1f989; AI新闻 &#x1f680; 英国人工智能初创公司Stability AI面临卖身压力 摘要&#xff1a;多位知情人士透露&#xff0c;英国人工智能初创公司Stability AI正寻求出售公司&#xff0c;因为投资者对其财务状况的压力越来越大。管理层最近几周一直将自己标榜为收购…

如何创建曼达洛人风格的照片效果

如何把一个普通的头盔变成一个以曼达洛人为灵感的头盔&#xff1b;如何使用一个场景创建戏剧性的天空效果 1. 如何在 Photoshop 中创建戏剧性的天空 步骤 1 我们将从拼凑我们的天空开始&#xff0c;专注于创造日落和繁星点点的夜空的完美融合。我将使用这张照片作为基地。 步…

Linux:进程状态

目录 1.Linux内核关于进程状态的源代码 2. 运行状态 3. 阻塞状态 4. 挂起 5.Linux中的进程状态 5.1 睡眠状态 5.2 暂停状态 5.3 僵尸进程与孤儿进程 我们在学习进程状态时&#xff0c;老师只是简单的让我们记住下面这张图 1.教材中进程操作系统的进程状态 那么这些…

threeJs引入模型使用3D模型(vite+React+Ts)

要在 Three.js 中使用 3D 模型&#xff0c;你需要加载模型文件并将其添加到场景中。Three.js 支持多种不同的模型格式&#xff0c;比如 OBJ、FBX、GLTF 等。 init vitelatest //创建一个vite的脚手架 选择react并配置Ts 安装three.js准备 npm install react-three/drei np…

信号类型(通信)——高斯最小频率键控(GMSK)

系列文章目录 《信号类型&#xff08;通信&#xff09;——仿真》 《信号类型&#xff08;通信&#xff09;——QAM调制信号》 《信号类型&#xff08;通信&#xff09;——QPSK、OQPSK、IJF_OQPSK调制信号》 《信号类型&#xff08;通信&#xff09;——最小频移键控&…

4.6-容器的端口映射

首先&#xff0c;我们来拉取Nginx的image镜像。 docker pull nginx 接下来我们创建一个Nginx的容器。 docker run --name nginx -d nginx 但是&#xff0c;这样启动nginx容器的话我们没法访问。这个时候怎么办呢&#xff1f;就需要将Nginx这个服务暴露给外面的世界。 这时可以使…