4-6 最小生成树Prim,Kruskal(贪心)

news2024/9/22 8:20:45

4.6最小生成树 Prim,Kruskal(贪心)

一、问题描述

设G =(V,E)是无向连通带权图,即一个网络。E中每条边(u,v)的权为 c[u][v]。
如果G的子图G’是一棵包含G的所有顶点的树,则称G’为G的生成树。生成树上各边权的总和称为该生成树的耗费。
在G的所有生成树中,耗费最小的生成树称为G的最小生成树(Minimum Spanning Tree ),简称MST。

二、构造最小生成树的有效算法:Prim算法和Kruskal算法,

两者贪心选择的方式不同,但都利用了最小生成树性质(贪心策略)∶设G=(V,E)是连通带权图,U是V的真子集。如果(u,v)eE,且ueU , veV-U且在所有这样的边中,(u,v)的权c[u][v]最小,那么一定存在G的一棵最小生成树,它以(u,v)为其中一条边。这性质称为MST(最小生成树)性质。

1.Prim算法(选顶点加入集合S)

- 每次选取能到达的最小的边

设G=(V,E)是连通带权图,V={1,2,.n}。构造G的最小生成树的Prim算法的基本思想是∶
(1)首先置S={1},
(2)然后,只要S是V的真子集,就作如下的贪心选择:选取满足条件i∈S, j∈V-S,且c[i][i]是最小的边,将顶点j添加到S中。
(3)这个过程一直进行到S=V时为止。
在这个过程中选取到的所有边恰好构成G的一棵最小生成树。

2.Kruskal算法(选择连接属于两个不同连通分支的最小边)

- 每次选取最短的且不构成回路的边

(1)首先将G的n个顶点看成n个孤立的连通分支。
(2)所有的边按权从小到大排序。
(3)顺序检查每条边,如果一条边的端点v和w分别是当前2个不同的连通分支T1和T2,用边(v,w)将T1和T2连接成一个连通分支,否则放弃这条边。
(4)该过程一直到只剩一个连通分支时为止(选择了n-1条边为止)。

三、代码

1.Prim算法(选顶点加入集合S)

- 每次选取能到达的最小的边

//最小生成树Prim算法 
/*每次将能到达的最短的边加进去 
closest[j]是j在S中的邻接顶点,
先找出V-S中使c[j][closest[j]](即lowcost[j]) 值最小的顶点j,
然后根据数组closest选取边(j,closest[j]),然后将j添加到S中,
最后对closest和lowcost做修改 
*/
#include<iostream>
#include<string.h>
#define INF 0x3f3f3f
using namespace std;
int n,m;//n个顶点,m条边
int c[100][100];
int s[1000];//s[i]=1表示顶点i被挑出来了,在生成树里了 
int closest[1000];//closest[j]是j在S中的邻接顶点
int lowcost[1000];//lowcost[j]就是c[j][closest[j]] 
void Prim(){
	for(int i=2;i<=n;i++){//初始化 
		lowcost[i]=c[1][i];
		closest[i]=1;
		s[i]=0; 
	}
	s[1]=1; 
	for(int i=1;i<n;i++){
		int t=INF;
		int j=1;//从第一个结点开始 
		for(int k=2;k<=n;k++){
			if(lowcost[k]<t && !s[k]){
				t = lowcost[k]; 
				j=k;
			}
		}
		cout<<"("<<closest[j]<<","<<j<<")= "<<lowcost[j]<<endl;
		s[j]=1;
		for(int k=2;k<=n;k++){
			if(c[j][k]<lowcost[k] && !s[k]){
				lowcost[k] = c[j][k];
				closest[k]=j;		
			}
		}
	}
}
int main(){
	cin>>n>>m;
	int i,j;
	int x,y,z;
	for(i=0;i<=n;i++) //初始化 
		for(j=0;j<=n;j++)
			c[i][j]=INF;
	for(i=0;i<m;i++){
		cin>>x>>y>>z;
		c[x][y]=z;
		c[y][x]=z;
	} 
	cout<<"Prim:依次加入的顺序为:\n";	
	Prim();
	return 0;
}

2.Kruskal算法(选择连接属于两个不同连通分支的最小边)

- 每次选取最短的且不构成回路的边

//最小生成树Kruskal
//每次选图中权值最小的边 
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m;//n个顶点,m条边
int s[1000];//并查集s[i]=1表示顶点i的父结点是1,即i与1在一个集合
struct edge{
	int u,v,w;//顶点u到顶点v的权重是w(无向图) 
}g[1000];
bool comp(edge a,edge b){
	return a.w < b.w;
}
int Init(){
	for(int i=0;i<m;i++){
		s[i]=i;//初始化,现在各自为王,自己就是一个集合
	}
} 
int Find(int x){//查询根结点
	if(s[x]==x)
		return x;
	else{
		s[x]=Find(s[x]);  //顺便把双亲结点也设置为根结点,路径压缩
		return s[x];
	}	
}
void Merge(int x,int y){//合并,把 y 合并到 x 中去,就是把y的双亲结点设为x
	s[Find(y)] = Find(x);
}
void Kruskal(){
	int x,y;
	for(int i=0;i<m;i++){
		x = g[i].u;
		y = g[i].v;
		if(Find(x) != Find(y)){
			cout<<"("<<x<<","<<y<<")= "<<g[i].w<<endl;
			Merge(x,y);
		}
	}
}
int main(){
	cin>>n>>m;
	int i;
	int x,y,z;
	for(i=0;i<m;i++){
		cin>>x>>y>>z;
		g[i].u=x;
		g[i].v=y;
		g[i].w=z;
	} 
	sort(g,g+m,comp);
	Init();
	cout<<"依次加入的顺序为:\n";
	Kruskal();
	return 0;
}

四、运行截图

测试用例

/*
6  10
1 2 6
1 3 1
1 4 5
2 3 5
2 5 3
3 4 5
3 5 6
3 6 4
4 6 2
5 6 6
*/ 

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

java计算机毕业设计基于安卓Android的校园快药APP-药店管理app

项目介绍 本文介绍了校园快药APP软件开发建设的意义和国内外发展现状,然后详细描述了所开发手机APP的可行性分析,并分析了手机APP所要实现的功能。因为校园快药设施较多,而且人口密集,不能更好的管理校园快药,造成需要时患者不必要的伤亡,所以采用比较方便的、容易便携的手机AP…

[附源码]Python计算机毕业设计Excel操作题自动评分系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

基于PHP+MySQL的企业宣传展示网

随着互联网的发展,企业越来越重视网上宣传渠道了。谢现在各大企业都有了自己的官网,以达到宣传企业或方便客户了解企业的目的。PHP企业宣传展示网分为前台和后台两部分。前台不部分主要是让用户了解和查看及动态等信息,使用的后台部分主要是企业的管理人员对网站的信息进行管理…

股票系统接口是如何进行数据共享的?

股票系统接口系统在量化交易中常见的一种数据挖掘系统&#xff0c;就比如说&#xff0c;如果你想要从别的网站或服务器上获取资源或信息&#xff0c;别人是不会把数据库共享过来的&#xff0c;他只能给你提供一个他们写好的编程方法来获取数据。也就是说通过股票系统接口输入你…

springboot15:junit5的使用

1.测试平台Junit springboot新版使用junit 只需要标注一个注解SpringBootTest然后方法中标注Test即可 以前springboot的使用 比较困难 现在整合使用后 只需要编写测试方法Test写测试的逻辑&#xff0c;整个类具有spring的功能&#xff0c;比如事务&#xff08;测试完成后会自动…

补盲激光雷达「PK」4D成像雷达,车企会作何选择?

关于4D成像雷达和激光雷达的争论&#xff0c;在此之前&#xff0c;两方势力之间还是有些克制。「谁也不是替代谁」&#xff0c;成了各方一致的看法。目标&#xff0c;也很一致&#xff0c;就是补齐摄像头的物理性能缺陷。 比如&#xff0c;与激光雷达相比&#xff0c;4D成像雷…

Python之第十一章 面向对象 --- 基础

目录 1.面向对象编程思想 1.编程思想 2.面向过程编程思想 3.面向对象编程思想 例 面向对象报名案例分析 面向过程与面向对象的区别 2.面向对象专业术语 1.组成 2.对象&#xff08;object&#xff09; 3.类&#xff1a; 1.引入类的原因 2.定义&#xff1a; 3.类的定…

2022HDC见闻与新技术学习体验分享

一、创新照见未来&#xff0c;共建鸿蒙世界&#xff0c;主题演讲笔记 以创新照见未来&#xff0c;共建鸿蒙世界为主题的第四界HDC大会于2022年11月4日在东莞松山湖线上与线下同时开启。本次大会展示了鸿蒙生态的最新成果与发展规划。第一天的主题演讲中&#xff0c;华为发布了解…

06-HTTPS单向认证及Java案例

一、单向认证流程 单向认证流程中&#xff0c;服务器端保存着公钥证书和私钥两个文件&#xff0c;整个握手过程如下&#xff1a; 客户端发起建立HTTPS连接请求&#xff0c;将SSL协议版本的信息发送给服务器端&#xff1b;服务器端将本机的公钥证书&#xff08;server.crt&am…

Windows - WINS Service

WINS SERVICE配置工作任务 安装及配置 WINS 服务; 配置为DCserver 为主WINS服务器。 WINS server - Windows server 更新 1-1 查看计算机名称 1-2 命令查看计算机名称: win+R---->>powerShell---->>命令nbtstat -n 1-3 查

《FFmpeg Basics》中文版-05-裁剪视频

正文 裁剪视频意味着从输入到输出中选择想要的矩形区域而没有余数。 裁剪通常用于调整大小&#xff0c;填充和其他编辑。 裁剪基础知识 较老的FFmpeg版本有cropbottom、cropleft、cropright和croptop选项&#xff0c;但现在已弃用&#xff0c;并使用下表中描述的裁剪操作。 …

微服务分布式开源架构是什么?

微服务分布式开源架构跟单体应用比起来有着较大的优势&#xff0c;可以解决单体系统的不足之处&#xff0c;满足日益增多的业务量需求。那么&#xff0c;微服务分布式开源架构是什么&#xff1f;什么软件服务商的微服务架构比较适合&#xff1f; 一、微服务分布式开源架构是什么…

nmap各种扫描的注意事项

1) nmap -sS 192.168.0.100 TCP的SYN扫描&#xff0c;也称为stealth扫描&#xff0c;扫描时&#xff0c;发送一个SYN包&#xff0c;等待SYN/ACK响应&#xff0c;当能够收到SYN/ACK响应时&#xff0c;就认为该端口是开放的。SYN扫描是一个速度极快而且结果又准的扫描&#xff0…

Linux 进程通信深剖

目录传统艺能&#x1f60e;进程间通信&#x1f914;通信方式&#x1f914;管道&#x1f914;匿名管道&#x1f914;pipe&#x1f914;匿名管道使用&#x1f914;读写规则&#x1f914;管道特点&#x1f914;同步与互斥&#x1f60b;管道生命周期&#x1f60b;流式服务&#x1f…

Nginx反向代理

代理概述 正向代理代理的对象是客户端&#xff0c;反向代理代理的是服务端&#xff0c;Nginx即可以实现正向代理&#xff0c;也可以实现反向代理。 正向代理 反向代理 正向代理案例 理论上Nginx可以支持正向代理上网&#xff0c;但是在实验中&#xff0c;域名访问有问题&am…

有奖报名|StarRocks 获开源热力值增速第一,有你的贡献

近日&#xff0c;由开放原子开源基金会、X-lab 开放实验室和阿里巴巴开源委员会联合出品的《2022 开源大数据热力报告》在云栖大会公布。StarRocks 荣登《2022开源大数据热力报告》Top 30&#xff0c;并作为数据查询与分析方向增速第一的项目受邀出席 11 月 17 日的线上圆桌讨论…

顺序表--C语言版(从0开始,超详细解析 ,小白一听就懂!!!)

目录 一、前言 &#x1f34e;什么是数据结构 &#x1f350;学习数据结构有什么用 二、顺序表概念 ------- &#xff08;线性表&#xff09; &#x1f349;什么是线性表 &#x1f353;顺序表概念详解 &#x1f4a6; 顺序表与数组的区别 三、顺序表详解 &#x1f34c;…

为数字化深水区“量身定制”,华为品质服务再迭代

作者 | 曾响铃 文 | 响铃说 因为工作数据没有及时更新、版本对不上&#xff0c;不得不带着文件和数据跑上跑下&#xff0c;与其他部门反复确认&#xff0c;拿回来最新的数据&#xff0c;才能开始安心工作——如果找不到人&#xff0c;工作就得等着&#xff0c;领导又在催&…

SpringBoot项目基础设施搭建

本文为《从零打造项目》系列第二篇文章&#xff0c;首发于个人网站。 《从零打造项目》系列文章 比MyBatis Generator更强大的代码生成器 SpringBoot项目基础设施搭建 前言 准确点说&#xff0c;这不是《从零打造项目》系列的第一篇文章&#xff0c;模版代码生成的那个项目讲解…

【非纯小白勿进】计算机的基本操作

计算机的基本操作 ​ 追看了前面文章&#xff0c;你就会对于计算机已经有了一个初步的认识&#xff0c;那么下面我们就要来使用计算机了。 计算机中只有文件和文件夹 ​ 计算机中&#xff0c;只有两样东西&#xff0c;文件和文件夹。 文件夹&#xff1a;本身不存储数据内容…