P3366 【模板】最小生成树

news2024/9/29 7:18:33

题目描述

如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 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

说明/提示

数据规模:

对于 20%20% 的数据,�≤5N≤5,�≤20M≤20。

对于 40%40% 的数据,�≤50N≤50,�≤2500M≤2500。

对于 70%70% 的数据,�≤500N≤500,�≤104M≤104。

对于 100%100% 的数据:1≤�≤50001≤N≤5000,1≤�≤2×1051≤M≤2×105,1≤��≤1041≤Zi​≤104。

样例解释:

所以最小生成树的总边权为 2+2+3=72+2+3=7。

1.这是一个最小生成树的算法,我们可以使用 kruskal算法或者prim算法,我这里使用的是kruskal算法。

2.这个算法的核心思想是先排序,排升序。

        然后在升序的权值中每次选择最小的,去看是否在已有节点的集合中。

        如果已经有了,就不需要,如果没有就需要,继而记录最小生成树的节点个数需要加1,到了n个节点之后,说明已经构成了最小生成树。跳出循环,输出最小值sum。

(这里可以看这篇:2023/1/4总结_lxh0113的博客-CSDN博客)

 

3.kruskal算法借助了并查集的思想,先设立它的最小生成树的节点已经有1个,因为刚开始的时候俩个节点合并的话,是算他们俩个的,所以初始值为1.

C 代码如下:

#include<stdio.h>
#define N 5010
#define M 200010
struct node
{
	int u,v,w;
}edges[M];
int b[N],n,m;
int getf(int x)
{
	if(b[x]==x) return x;
	b[x]=getf(b[x]);
}
int pd(int x,int y)
{
	int p,q;
	p=getf(b[x]);
	q=getf(b[y]);
	if(p!=q)
	{
		b[q]=p;
		return 1;
	}
	else return 0;
}
int quicksort(int left,int right)
{
	if(left>=right) return 0;
	int i=left,j=right;
	struct node t,temp=edges[left];
	while(i<j)
	{
		while(i<j&&temp.w<=edges[j].w) j--;
		while(i<j&&temp.w>=edges[i].w) i++;
		if(i<j)
		{
			t=edges[i];edges[i]=edges[j];edges[j]=t;
		}
	}
	edges[left]=edges[i];
	edges[i]=temp;
	quicksort(left,i-1);
	quicksort(i+1,right);
}

int kruskal()
{
	int i,j,sum=0;
	for(i=0,j=1;i<m;i++)
	{
		if(pd(edges[i].u,edges[i].v)==1)
		{
			j++;
			sum+=edges[i].w;
		//	printf("%d %d \n",edges[i].u,edges[i].v);
		}
		if(j>=n) break;
	}
	if(i>=m) return -1;
	return sum;
}

int main()
{
	int i,j,k;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
		b[i]=i;
	for(i=0;i<m;i++)
	{
		scanf("%d%d%d",&edges[i].u,&edges[i].v,&edges[i].w);
	}
	quicksort(0,m-1);
	k=kruskal();
	if(k==-1) printf("orz\n");
	else printf("%d\n",k);
	return 0;	
}

C++代码如下:

#include<algorithm>
#include<iostream>
#include<bits/stdc++.h>

using namespace std;

const int  N = 5010;
const int M = 200010;
struct node 
{
	int u, v, w;
} edges[M];

int b[N], n, m;
int getf(int x) 
{
	if (b[x] == x) return x;
	b[x] = getf(b[x]);
}
int pd(int x, int y) 
{
	int p, q;
	p = getf(b[x]);
	q = getf(b[y]);
	if (p != q) 
	{
		b[q] = p;
		return 1;
	} else return 0;
}
bool cmp(node a, node b) 
{
	return a.w < b.w;
}

int kruskal() 
{
	int i, j, sum = 0;
	for (i = 0, j = 1; i < m; i++) 
	{
		if (pd(edges[i].u, edges[i].v) == 1) 
		{
			j++;
			sum += edges[i].w;
		}
		if (j >= n) break;
	}
	if (i >= m) return -1;
	return sum;
}

int main() 
{
	int i, j, k;
	cin >> n >> m;
	for (i = 1; i <= n; i++)
		b[i] = i;
	for (i = 0; i < m; i++) 
	{
		cin >> edges[i].u >> edges[i].v >> edges[i].w ;
	}
	sort(edges, edges + m - 1, cmp);
	k = kruskal();
	if (k == -1) cout << "orz" << endl;
	else cout << k << endl;
	return 0;
}

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

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

相关文章

【K8S系列】Pod重启策略及重启可能原因

目录 1 重启策略 1.1 Always 1.2 OnFailure 1.3 Nerver 1.4 yaml示例 2 Pod常见异常状态 2.1 Pending状态 2.2 Waiting/ContainerCreating状态 2.3 CrashLoopBackOff状态 2.4 ImagePullBackOff状态 2.5 Error状态 2.6 其他状态说明 tips: 3.自动重启的可能原…

【HBase——陌陌海量存储案例】5. Apache Phoenix快速入门

6.3 快速入门 6.3.1 需求 本次的小DEMO&#xff0c;我们沿用之前的订单数据集。我们将使用Phoenix来创建表&#xff0c;并进行数据增删改查操作。 列名说明id订单IDstatus订单状态money支付金额pay_way支付方式IDuser_id用户IDoperation_time操作时间category商品分类 6.3.…

Ruoyi-Cloud框架学习-【06 新增业务项目】

新建模块 结构查看 新增子模块&#xff0c;按照若依赖的约定&#xff0c;避免后续出现问题&#xff0c;当然一通百通&#xff0c;也可以按照自己的思路配置&#xff0c;修改对应的配置即可。 后端项目结构如下&#xff0c;通过观察&#xff0c;我们需要新增自己的模块在ruoy…

git reset

reset三种模式区别和使用场景区别&#xff1a;--hard&#xff1a;重置位置的同时&#xff0c;直接将 working Tree工作目录、 index 暂存区及 repository 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区。--soft&#xff1a;重置位置的同时&#xff0c;保…

Java后端项目排错经验分享

导致错误的原因有很多&#xff0c;最常见的无非也就那么几种&#xff1a; 1、粗心导致的格式问题以及代码多写少写错写字母的问题 2、代码逻辑问题 3、框架版本不匹配问题 无论是哪种问题&#xff0c;排查错误的方式最好最便捷的方式有调试日志&#xff0c;那么如果是线上问…

【头歌】循环队列及链队列的基本操作

第1关&#xff1a;循环队列的基本操作任务描述本关任务是实现循环队列的基本操作函数&#xff0c;以实现判断队列是否为满、是否为空、求队列元素个数、进队和出队等功能。相关知识队列的基本概念队列&#xff08;简称队&#xff09;也是一种运算受限的线性表&#xff0c;在这种…

Kubernetes集群搭建 (未完待续)

Kubernetes集群搭建 目录 前言前期准备K8S集群安装 虚拟机设置安装K8S集群k8s部署Nginx 附录1 Docker安装附录2 yum k8s 问题附录3 k8s start问题附录4 k8s master init 前言 本文指定Docker与K8s版本&#xff0c;保证兼容性&#xff0c;可供参考 Docker‐ce‐3:19.03.9‐3…

推荐7个高质量图片素材网站

这期给大家分享7个免费、高质量图片素材网站&#xff0c;而且无版权&#xff0c;不用担心侵权&#xff01;建议收藏。 1、潮点视频 https://shipin520.com/shipin-tp/0-1329-0-0-0-0-0-0-0-1.html?from_code2510 网站主要以提供高质量视频素材为主&#xff0c;但也有大量的配…

基于FPGA的啸叫检测与抑制系统设计与实现verilog

针对啸叫的问题,本文设计了一种基于移频算法的啸叫抑制器。采用高性能音频编解码芯片对音频信号采样,移频器对采样所得的音频信号进行移频,移频频率范围为0~8Hz,再用音频芯片输出,采用FFT算法计算出啸叫点频率值,显示在LCD1602上,此移频器可达到快速有效的啸叫抑制效果。…

【JVM】垃圾回收之对象已死

文章目录1. 概述2. 引用计数算法3. 可达性分析算法4. 引用的分类4.1 软引用的应用本文参考&#xff1a;深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践&#xff08;第3版&#xff09; 1. 概述 总所周知&#xff0c;垃圾收集器的任务就是将“死去”的对象回收。 那么&a…

自动驾驶感知——毫米波雷达

文章目录1. 雷达的基本概念1.1 毫米波雷达分类1.2 信息的传输1.3 毫米波雷达的信号频段1.4 毫米波雷达工作原理1.4.1 毫米波雷达测速测距的数学原理1.4.2 毫米波雷达测角度的数学原理1.4.3 硬件接口1.4.4 关键零部件1.4.5 数据的协议与格式1.5 车载毫米波雷达的重要参数1.6 车载…

94. BERT以及BERT代码实现

1. NLP里的迁移学习 使用预训练好的模型来抽取词、句子的特征 例如word2vec 或语言模型 不更新预训练好的模型需要构建新的网络来抓取新任务需要的信息 Word2vec忽略了时序信息&#xff0c;语言模型只看了一个方向Word2vec只是抽取底层的信息&#xff0c;作为embedding层&…

数据太多?3款免费数据分析软件,分分钟解决

本文分享下我在做数据分析时用过的几个简单易上手的数据可视化软件。 先放上目录&#xff1a; 数据统计收集类——简道云数据图表美化类——图表秀数据开发类——Echart 01 简道云 https://www.jiandaoyun.com/ 适用于&#xff1a;想要“简单易上手”适合业务人员&#xff0…

TF-A源码移植的过程

1.解压标准 tf-a 源码包&#xff1a; tar xfz tf-a-stm32mp-2.2.r2-r0.tar.gz 2.将 ST 官方补丁文件打到 tf-a 源码中&#xff1a; 3.配置交叉编译工具链&#xff1a; 进入~/FSMP1A/tf-a-stm32mp-2.2.r2-r0$ 目录下&#xff0c;打开Makefile.sdk 将如下内容进行更改 4.复制设…

【前端设计】监控顺序返回型总线超时的计时器模块设计

前言 总线超时检查机制是系统中必要的模块设计&#xff0c;用于在总线无法返回response时能够及时上报中断。从理论上分析&#xff0c;如果总线发生了诸如挂死或者物理损坏等超时行为&#xff0c;无论计时器上报timeout的时间偏大还是偏小&#xff0c;都是一定可以上报中断的。…

Xilinx MicroBlaze系列教程(适用于ISE和Vivado开发环境)

本文是Xilinx MicroBlaze系列教程的第0篇文章。这个系列文章是我个人最近两年使用Xilinx MicroBlaze软核的经验和笔记,以Xilinx ISE 14.7和Spartan-6,以及Vivado 2018.3和Artix-7为例,介绍MicroBlaze软核、AXI系列IP核的软硬件使用,希望能帮助到更多的人。 MicroBlaze是Xil…

什么是有限元分析?能用来干什么

您是否想过工程师和制造商如何测试他们设计的耐用性、强度和安全性&#xff1f;如果您看过汽车广告&#xff0c;您可能会相信工程师和设计师不断地破坏他们的产品以测试其强度。您可能会得出结论&#xff0c;制造商会重复此过程&#xff0c;直到设计能够承受巨大的损坏并达到可…

夜游经济:夜景“亮化”,形象“美化”,经济“活化”

复杂的国际形势之下&#xff0c;扩大国内消费需求&#xff0c;激发消费市场潜力&#xff0c;堪称疫后经济复苏振兴的“金钥匙”。这一背景下&#xff0c;大力发展夜游经济&#xff0c;成为提振国内消费需求、促进城乡居民就业、拉动经济复苏增长的重要突破口。去年以来&#xf…

无法超越的100米_百兆以太网传输距离_网线有哪几种?

对网络比较了解的朋友&#xff0c;都知道双绞线有一个“无法逾越”的“100米”传输距离。无论是10M传输速率的三类双绞线&#xff0c;还是100M传输速率的五类双绞线&#xff0c;甚至1000M传输速率的六类双绞线&#xff0c;最远有效传输距离为100米。在综合布线规范中&#xff0…

Qt下实现欧姆龙PLC 串口发送HOSTLINK(FINS)模式

文章目录前言一、HOSTLINK协议说明二、校验码&#xff08;FCS&#xff09;计算三、示例完整代码四、下载链接总结前言 本文讲述了Qt下模拟串口调试工具发送HOSTLINK&#xff08;FINS&#xff09;模式&#xff0c;主要进行了HR保持区的字和位的读写&#xff0c;对HOSTLINK协议中…