4.6--贪心--最小生成树(MST)

news2024/10/7 6:50:04

一共有两种方法Prim算法和Kruskal算法都可以看作是应用贪心算法设计策略的例子。

Prim算法--选集合S中所有顶点的邻接点 距离最短的那个点(不属于S)加入集合S

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

它们都利用了下面的最小生成树性质:如果途中具有最小权值的边只有一条,那么这条边包含在任意一个最小生成树中。

设G=(V,E)是连通带权图,U是V的真子集。如果(u,v)属于E,且顶点u属于U,顶点v属于V-U,且在所有这样的边中,(u,v)的权c[u][v]最小,那么一定存在G的一棵最小生成树,它以(u,v)为其中一条边。这个性质有时也称为MST性质。

 

Prim算法--选集合S中所有顶点的邻接点 距离最短的那个点(不属于S)加入集合S

Prim算法的每一步都会为一棵生长中的树添加一条边,该树最开始只有一个顶点,然后会添加V−1个边。每次总是添加生长中的树和树中除该生长的树以外的部分形成的切分的具有最小权值的横切边。

 描述:首先S中只有一个顶点S={1},然后,只要S!=V说明点还没有取完,就贪心选择满足条件的距离S中最小得边(i,j),把不在S集合中的顶点j添加到S集合中,一直循环到S=V结束

 条件是什么?--选集合S中所有顶点的邻接点 距离最短的那个

按Prim算法选取边的过程如下页图所示

 

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

首先将G的n个顶点看成n个孤立的连通分支。将所有的边按权从小到大排序

然后从第一条边开始,依边权递增的顺序查看每一条边,并按下述方法连接2个不同的连通分支:当查看到第k条边(v,w)时,如果端点v和w分别是当前2个不同的连通分支T1和T2中的顶点时,就用边(v,w)将T1和T2连接成一个连通分支,然后继续查看第k+1条边;如果端点v和w在当前的同一个连通分支中,就直接再查看第k+1条边。

这个过程一直进行到只剩下一个连通分支时为止。 

 

 伪代码

 代码Prim

//最小生成树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<fstream>
#include<string.h>
#define INF 0x3f3f3f
using namespace std;

ifstream fin("4d6.txt");
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;
    fin>>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++){
		fin>>x>>y>>z;
		c[x][y]=z;
		c[y][x]=z;
	} 
	cout<<"Prim:依次加入的顺序为:\n";	
	Prim();
	return 0;
}

 代码kruskal

//最小生成树Kruskal
//每次选图中权值最小的边 
#include<iostream>
#include<string.h>
#include<fstream>
#include<algorithm>
using namespace std;
ifstream fin("4d6.txt");
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;
}
void 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(){
	fin>>n>>m;
	int i;
	int x,y,z;
	for(i=0;i<m;i++){
		fin>>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/195654.html

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

相关文章

VRP系统下增加网络设备安全性之console接口

VRP即华为设备的操作系统 增加网络设备安全性的其中一种措施是增加console的安全 增强console安全性 1、使用密码登陆 首先先进入设备的console接口&#xff1a; 在进入系统视图时&#xff0c;可以使用system-view或sys 在进入console接口时&#xff0c;可以使用user-inte…

RPC的序列化方案详解

1 为什么需要序列化&#xff1f; 网络传输的数据须是二进制数据&#xff0c;但调用方请求的出入参数都是对象&#xff1a; 对象不能直接在网络传输&#xff0c;需提前转成可传输的二进制&#xff0c;且要求可逆&#xff0c;即“序列化” 将对象转换成二进制数据 这时&#xf…

拉伯证券|磷酸铁锂电池低温性能怎么解?

磷酸铁锂系电池本钱相对三元系电池低&#xff0c;且安全性好&#xff0c;寿命长。随着技能的前进&#xff0c;实践能量密度也在无限挨近理论能量密度。所以其市场占有率也在稳步上升&#xff0c;且现已超越三元系锂电池的装机量。 但磷酸铁锂&#xff08;LiFePO4&#xff0c;L…

Java网络编程 - UDP通信

文章目录UDP通信快速入门一发一收多发多收广播组播UDP通信 快速入门 UDP协议的特点: UDP是一种无连接、不可靠传输的协议。 将数据源IP、目的地IP和端口以及数据封装成数据包&#xff0c;大小限制在64KB内&#xff0c;直接发送出去即可。 UDP协议通信首先要有DatagramPacket数…

flume kafka channel 应用详解

1 官方文档 Documentation -> Flume User Guide2 kafka source (消费者) Kafka Source is an Apache Kafka consumer that reads messages from Kafka topics. If you have multiple Kafka sources running, you can configure them with the same Consumer Group so each …

2.DjangoRestFramework【基于DRF的RESTAPI的序列化使用】

进入Django rest framwork官网就能看到rest_framwork相关的教程; 1.安装rest_framwork pip install djangorestframework pip install markdown # Markdown support for the browsable API. pip install django-filter # Filtering support2.在setting中注册 setting…

QT-线性拟合(自动找直线区域)

最近有个需求&#xff0c;需要对一个S曲线的散点图做线性拟合&#xff0c;百度上线性拟合和曲线拟合公式很多&#xff0c;没什么问题&#xff0c;但需求里面有一个预期就是自动找出直线部分&#xff0c;前面因为其它事情耽搁&#xff0c;一直没有实现&#xff0c;心里多少有点梗…

SpringBoot微服务项目,转发并响应下载请求

在微服务项目中&#xff0c;我经常会碰到从一个微服务项目转发下载请求并实现下载文件的需求&#xff0c;因此在此做一个转发下载的示例。总的下载转发流程如下&#xff0c;我会按照这个流程一一介绍下载流程。 1、客户端的下载请求 这里主要介绍controller层是如何接收客户端…

apple pencil一代平替笔有哪些?平替电容笔推荐

当今社会&#xff0c;高科技推动了数字产品的发展。无论是在工作中&#xff0c;还是在学习中&#xff0c;大的屏幕都能让画面变得更清楚。不管是现在还是未来&#xff0c;Ipad设备都会变成我们每天的一个重要组成部分。如果ipad与一款易于使用的电容笔相结合&#xff0c;将会大…

git-secret:在 Git 存储库中加密和存储密钥(下)

在本篇文章中&#xff0c;将带你了解如何在 Docker 容器中设置git-secret和gpg&#xff0c;通过 Makefile recipe 为不同的场景创建工作流。 Makefile Adjustment 将git-secret和gpg指令添加到 Makefile 中.make/01-00-application-setup.mk&#xff1a; # File: .make/01-0…

C语言基础复习

目录 数组 一维数组 完全初始化int a[5]{1,2,3,4,5}; 不完全初始化int a[5]{1,2} 完全不初始化”&#xff0c;int a[5] 二维数组 完全初始化 不完全初始化 指针 变量的访问方式&#xff1a; 指针变量的定义&#xff1a; 指针变量的赋值&#xff1a; 指针变量的运算…

Spring-Security入门

简介 Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 ​ 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多&#xff0c;因为相比与Spring…

ChatGPT - InstructGPT 论文简读

发表于NLP会议:NeurlPS,EMNLP EMNLP: Empirical Methods in Natural Language Processing,自然语言处理中的经验方法NeurlPS: Neural Information Processing Systems,神经信息处理系统ChatGPT: Optimizing Language Models for Dialogue,优化对话的语言模型 ChatGPT:htt…

一文了解编程领域的模版

文章目录模版含义代码模版泛型模版引擎小结&#x1f34a;在编程领域&#xff0c;模板是一种代码片段&#xff0c;它可以被重复使用&#xff0c;并允许您在保持代码的基本结构不变的情况下&#xff0c;根据需要调整其中的内容。模板通常在构建大型程序或开发一类相关程序时非常有…

Arthas的学习与使用

一、简介 Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时&#xff0c…

Maven知识点-反应堆

前言 在一个多模块的Maven项目中&#xff0c;反应堆&#xff08;Reactor&#xff09;是指所有模块组成的一个构建结构。对于单模块的项目&#xff0c;反应堆就是该模块本身&#xff1b;但是对于多模块项目来说&#xff0c;反应堆就包含了各模块之间继承和依赖的关系&#xff0…

一篇带你MySQL入门

文章目录1. MySQL概述1.1 数据库相关概念1.2 MySQL数据库1.2.1 版本1.2.2 下载1.2.3 数据模型2. SQL2.1 SQL通用语法2.2 SQL分类2.3 DDL2.3.1 数据库操作2.3.2 表操作2.4 图形化界面工具2.4.1 安装2.4.2 使用2.5 DML2.5.1 添加数据2.5.2 修改数据2.5.3 删除数据2.6 DQL2.6.1 基…

每天一道大厂SQL题【Day04】大数据排序统计

每天一道大厂SQL题【Day04】大数据排序统计 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&#x…

酒店管理|基于Springboot+Vue前后端分离实现酒店管理系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

webpack5从入门到精通

前言 webpack是什么&#xff1f; 摘自官网的一段话&#xff1a;webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时&#xff0c;它会在内部从一个或多个入口点构建一个 依赖图(dependency graph)&#xff0c;然后将你项目中所需的每…