采用Kruskal算法生成最小生成树,并采用并查集的合并优化和查询优化。

文章目录

    • 最小生成树
      • 1.什么是图的最小生成树(MST)?
      • 2.最小生成树用来解决什么问题?
    • Kruskal(克鲁斯卡尔)算法
      • 算法描述
    • 图解

最小生成树

1.什么是图的最小生成树(MST)?

用N-1条边连接N个点,形成的图形一定是树。
一个具有N个点的有权无向图,最小生成树就是从图的所有边中选择N-1条出来,连接所有的N个点。这个N-1条边的边权之和是所有方案中最小的。
在这里插入图片描述

2.最小生成树用来解决什么问题?

用来解决如何用最小的“代价”用N-1条边连接N个点的问题。

Kruskal(克鲁斯卡尔)算法

Kruskal算法是一种巧妙利用并查集来求最小生成树的算法。
Kruskal首先初始化并查集,把N个点看做N个独立的集合。再将所有的边从小到大排序。然后按顺序枚举每一条边,如果这条边连接的两个点属于两个集合,那么就把这条边加入最小生成树,并且合并这两个集合;如果这条边连接的两个点属于同一集合,就跳过。直到选取了N-1条边为止。

算法描述

1.初始化计数器k=0;MST=0;(K用来记录边数,MST用来记录边的权值之和)
2.初始化并查集:Parent[x]=x;(把n个点初始化为n个独立的集合,每个点的父节点是它自身)
3.将所有边用Sort()从小到大排序
在这里插入图片描述

 for(i=1;i<=M;i++){ // M为边数,对边进行从小到大的循环if(Find(E[i].u)!=Find(E[i].v)){ // 调用查找函数,第i条边的端点u,第i条边的端点v,即查询端点u和端点v的根节点,如果根节点不相等,说明两个点处于两个不相同的集合之中Union(E[i].u,E[i].v);//把u,v个治所在的集合合并  // E[i]进行边集数组储存,表示第i条边MST+=E[i].w; //把每条边的边权相加k++; //计数器 }if(K==N-1) break; //说明生成最小生成树} 

在这里插入图片描述

图解

在这里插入图片描述

//最小生成树:Kruskal算法+边集存储+并查集#include<iostream>
#include<algorithm>
using namespace std;struct Edge{int u,v,w;
}E[101]; //边集数组储存 
int Parent[101];//并查集,定义Parent[]数组 int Find(int x) //查找根节点并压缩路径
{if(Parent[x]!=x)Parent[x]=Find(Parent[x]);return Parent[x]; } void Union(int x,int y){ //合并两个集合 Parent[Find(y)]=Find(x);}int Cmp(const Edge &a,const Edge &b){ //自定义比较函数 return (a.w<b.w)?1:0; }int main(){int i,j,k=0,MST=0;int N=5,M=7;//顶点数和边数 int e[9][3]={{1,2,2},{1,3,5},{1,4,2},{2,3,3},{3,4,1},{2,5,4},{3,5,6}};for(i=1;i<=M;i++){E[i].u=e[i-1][0];E[i].v=e[i-1][1];E[i].w=e[i-1][2];}//存边for(i=1;i<=M;i++){Parent[i]=i; //初始化并查集} sort(E+1,E+M+1,Cmp);//调用快排序,对应的时间复杂度为O(E*logE) printf("u v w\n");for(i=1;i<=M;i++){printf("%d %d %d\n",E[i].u,E[i].v,E[i].w);//跟踪 } //求解最小生成树 printf("\n u v w MST\n");   //时间复杂度为O(M)或者O(E) for(i=1;i<=M;i++){if(Find(E[i].u)!=Find(E[i].v)){Union(E[i].u,E[i].v);MST+=E[i].w;k++;printf("%d %d %d %d\n",E[i].u,E[i].v,E[i].w,MST);//跟踪}if(k==N-1) {break;} }printf("\n MST=%d\n",MST);} 

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

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

相关文章

Java连接Mysql数据库(JDBC)

文章目录导入包con、stmt、rs 三者存在一定的关系getInt和getStringinput.nextInt();简单使用讲解ResultSet和StatementPreparedStatement的用法JDBC连接代码更多样例导入包 import java.sql.Connection; import java.sql.DriverManager; import java.sql.statement; import j…

Linux编程考前测试题

文章目录选择题多选题判断题填空题简答题编程题选择题 1:当打开vi文本编辑器编辑文件时&#xff0c;vi处于&#xff08;A&#xff09;模式 A: 命令模式 B: 编辑模式 C: 实模式 D: 虚模式 2:下列有关fork&#xff08;&#xff09;函数返回值说法错误的是&#xff08;D&#xf…

MySQL考试复习(知识点、练习题)

文章目录数据库的管理技术的三个阶段发展的三个阶段数据库的锁数据库设计的基本步骤事务的四大特性什么是视图如果关系模式设计不好&#xff0c;可能带来哪几个问题数据库管理系统的主要功能有哪些数据库系统中的常见故障有哪些简述SQL语言的组成说明关系模型有哪三类完整性规则…

Oracle复习(知识点、练习题、实验)

文章目录第一章 数据库概念数据库的三级模式结构&#xff1a;模式、外模式、内模式三级模式之间的映射第二章 Oracle12g体系结构Oracle的逻辑存储结构Oracle物理存储结构Oracle11g服务器结构系统全局区&#xff08;SGA&#xff09;程序全局区&#xff08;PGA&#xff09;第三章…

Openstack面试题和知识点总结

文章目录知识点云计算起源定义特点分类服务类型平台分类应用虚拟化虚拟化技术定义分类云计算和虚拟化的关系虚拟化的优点OpenStack简介核心架构Openstack组件共享服务组件核心组件组件详解RabbitMQ概念特点rabbitmq中的概念工作原理常用操作MemcachedKeystoneGlance工作原理Nov…

auto.js 实现信息发送、QQ点赞、微信点赞、健康日报签到

文章目录auto.js开发文档安装total control在手机端安装auto.js apk安装vscode短信多条发送QQ点赞微信点赞健康日报填写叠猫猫auto.js开发文档 点击学习 安装total control total control 用于手机投屏在电脑屏幕上 在手机端安装auto.js apk 链接&#xff1a;https://pan.…

MapReduce综合学习含Wordcount案例

文章目录MapReduce简介MapTaskReduceTaskMapper阶段解读Reducer阶段解读MapReduce适用的问题MapReduce的特点MapReduce基本思想大数据处理思想&#xff1a;分而治之构建抽象模型&#xff1a;Map 函数和 Reduce 函数上升到架构&#xff1a;并行自动化并隐藏底层细节MapReduce计算…

基于Spring boot+Vue的在线考试系统

文章目录spring boot 分层图解安装idea配置阿里云镜像项目启动前端项目结构项目前端中index.htmlApp.vuemain.jsrouter整个页面渲染过程关于矢量图图标的使用引入JQuery依赖github-markdown-css样式文件-一般用作文章正文的样式美化spring boot 分层图解 安装idea 安装参考 id…

Java基础总结之(面试)

文章目录Java标识符Java修饰符访问权限修饰符访问控制和继承非访问权限修饰符局部变量修饰符接口接口中方法修饰符运算符算术运算符一元运算符二元运算符算术赋值运算符赋值运算符逻辑运算符&#xff08;&&、||和!&#xff09;关系运算符自增和自减运算符&#xff08;和…

Javaweb练手项目

文章目录学生管理系统音乐网站锋芒博客中医药管理系统博客天梯CMS系统锋芒社团官网学生管理系统 实现技术&#xff1a;ServletMVC&#xff08;模式&#xff09;Filter(过滤器&#xff09;html 主要功能&#xff1a;学生信息的增删查改&#xff0c;文件&#xff08;图片&#x…

Spark之scala学习(基础篇)待更新

文章目录引言大数据介绍大数据与云计算区别大数据和人工智能的区别大数据和传统的分析&#xff08;excel&#xff09;的区别scala的特性面向对象特性函数式编程函数式编程的特点&#xff1a;函数式编程的优势静态类型扩展性并发性为什么要学scalascala安装简单测试了解ScalaSca…

Jupyter Notebook的安装及问题解决方案

文章目录下载并安装Anaconda3更改主界面路径但是如果没有jupyter_notebook_config.py文件怎么办&#xff1f;如果更改过路径后&#xff0c;不生效怎么办&#xff1f;使用参考pycharm导入pyspark下载并安装Anaconda3 官网下载个人版 Anaconda3安装参考 点击&#xff0c;然后进…

airodump-ng wlan0mon扫描不到网络_MySQL ProxySql 由于漏洞扫描导致的 PROXYSQL CPU 超高...

ProxySQL 本身是一款非常棒的MYSQL 中间件的开源产品, 在公司运行了一段时间后,突然一天报警,所在机器的CPU 出奇的高,之前在测试系统, 预生产, 以及生产系统均没有出现问题. 开始未来紧急解决问题,重新启动了proxysql服务,并查看错误日志.PROXYSQL 的系统版本的2.012 MYSQL 的…

4个空格和一个tab有什么区别_火花塞为什么一换就是4个?只换一个不行吗?

火花塞不是一个经常被提及的配件&#xff0c;但如果火花塞老化&#xff0c;车辆的整体性能将受到影响&#xff0c;更换火花塞其实也是日常保养的一部分&#xff0c;就像换机油和三滤一样。不知道大家是否注意到&#xff0c;在做完保养之后&#xff0c;维修师傅会帮你检查一下火…

小型云台用的是什么电机_直流电机的工作原理是什么?未来的电动车都会用直流电机吗?...

说起直流电机&#xff0c;其实我们每个人&#xff0c;每天都在用。是吗&#xff1f;别惊讶&#xff0c;是的。手机&#xff0c;我们每天都在用&#xff0c;有消息或者有电话时&#xff0c;手机就开始振动。这个振动就是用直流电机来实现的。当然&#xff0c;直流电机在其他领域…

C语言、C++学习路线

文章目录C语言 C语言大纲 C语言知识点总结图 C语言视频推荐基础篇进阶篇速成篇基础入门之游戏实战篇C语言核心链表文档教程视频教程文件C语言实例C C大纲岗位分析 C与C 编程基础四大件数据结构与算法计算机网络操作系统设计模式C视频推荐C语言 C语言大纲 C语言知识点总结图 C语…

2020年日历_2020年《故宫日历》发布:浓缩紫禁城600年沧桑

2020年《故宫日历》。中国网记者 刘维佳/摄中国网8月26日讯(记者 刘维佳) 2020年《故宫日历》发布会今日在故宫博物院建福宫举行。2020年为庚子鼠年&#xff0c;亦正值紫禁城建成六百周年&#xff0c;因此&#xff0c;2020年《故宫日历》是为纪念紫禁城六百周年而特别呈现。故宫…

jav简单的个人博客网站代码_每个人都可以拥有的个人博客网站

题记------去过的地方越多&#xff0c;越知道自己想回到什么地方去&#xff01;雨又下了一夜&#xff0c;曾经多少次觉得下雨天是最适合睡觉的天气。而最近的雨&#xff0c;总感觉有些嘈杂&#xff0c;总怕吵醒远方睡梦中的星&#xff0c;晨。以至于翻来覆去睡不着。但是&#…

泰禾光电机器人研发_机器之眼 | 3D相机能让机器人看见什么?

“中国制造2025”&#xff0c;其核心环节之一就是机器人智能化。视觉技术代表了机器的眼睛和大脑&#xff0c;机器视觉将使得机器人智能化变成现实。为了使机器人能够胜任更复杂的工作&#xff0c;机器人不但要有更好的控制系统&#xff0c;还需要更多地感知环境的变化。机器人…

云计算学习路线

文章目录说明云计算学习路线云计算技术支撑Linux 基础环境搭建文档教程Linux学习视频推荐云计算基础知识docker容器KVM&#xff08;推荐一本书《深度实践KVM》&#xff09;OpenStackK8S&#xff08;Kubernetes&#xff09;说明 云计算和大数据未来十年必然趋势成为社会的生产资…