克鲁斯卡尔-最小生成树

2024-01-12 23:30
文章标签 最小 生成 卡尔 克鲁斯

本文主要是介绍克鲁斯卡尔-最小生成树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最小生成树实际意义在于解决一张图里面,把所有顶点用最短路径全部连接

第三次人工智能浪潮

看了杨澜的节目,才继续坚持写,人工智能需要好的算法,是先人们几辈的积累和爆发

我们要抓住这个时代。

克鲁斯卡尔算法,最小生成树,插边,适合边少,稀疏

借助两个数组,一个(se[]) 用来存放已经按照权值从小到大排完序的表

一个(set[])用来存放顶点属于哪一个集合,刚开始初始化所有顶点独占一个集合

每次插入一个se里面内容值,根据顶点更新set

还是这张图片

[0]000001
[1]111111
[2]200001
[3]333301
[4]444111
[5]553301
set初始化,指向自己加入se[0]加入se[1]加入se[2]加入se[3]加入se[5]
/*
克鲁斯卡尔算法
*/
void Kruskal(Graph my_map)
{side se[MAX_SIZE];//存储边的信息int my_set[MAX_SIZE],k=0,number=0;//边数int temp,j;/*按照升序排列边*/for(int i=0;i<my_map->vexnum;i++){for(int j=i+1;j<my_map->vexnum;j++)//只寻找邻接矩阵的上半三角就欧克{if(my_map->tyust[i][j]<INFINTY)//说明边连线存在{k=number-1;//下面有用处while(k>=0)//一直寻找,返回插入点k{if(se[k].weiget>my_map->tyust[i][j])//权重判断{se[k+1]=se[k];//如果权重大,就将它后移k--;//把游标指向上一个}else  break;}se[k+1].a=i;se[k+1].b=j;se[k+1].weiget=my_map->tyust[i][j];number++;//边数加一}}}///打印出se[]///for(int i=0;i<number;i++){printf("se[%d],a,b,weiget\n",i,se[i].a,se[i].b,se[i].weiget);}初始化my_set[],先指向自己///for(int j=0;j<my_map->vexnum;j++){my_set[j]=j;}cout<<"生成树边:"<<endl;k=0;j=0;while(k<my_map->vexnum-1)//n个顶点需要n-1条边{if(my_set[se[j].a]!=my_set[se[j].b])//如果一条边的两个顶点不都在集合中{//j=0,从最小边开始cout<<my_map->vex[se[j].a]<<"-"<<my_map->vex[se[j].b]<<endl;temp=my_set[se[j].b];for(int i=0;i<my_map->vexnum;i++)//对所有顶点{if(my_set[i]==temp){my_set[i]=my_set[se[j].a];//参照上图来看}}k++;//已有边数加一}j++;}
}

最后贴一下所有代码

#include <iostream>
#include <malloc.h>
#include <cstdio>
#define  MAX_SIZE  20
#define  INFINTY   256
using namespace std;
typedef  struct graph
{int arcnum,vexnum;//弧数,顶点数int tyust[MAX_SIZE][MAX_SIZE];//邻接矩阵char vex[MAX_SIZE];//顶点
}*Graph;
struct side
{int a,b;//一条边的左右两个顶点下标int weiget;//权重
};
int get_pos(Graph my_map,char c)
{for(int i=0;i<my_map->vexnum;i++){if(my_map->vex[i]==c){return i;}}return -1;
}
void print(Graph my_map)
{for(int i=0;i<my_map->vexnum;i++){for(int j=0;j<my_map->vexnum;j++){printf("%-4d",my_map->tyust[i][j]);}cout<<endl;}cout<<endl;
}/*
创建图
*/
Graph creat_graph()
{int arc_num,vex_num;int p1,p2;char in1,in2;int my_weiget;Graph pit=(Graph)malloc(sizeof(graph));cout<<"请按照顺序输入顶点数和弧数"<<endl;cin>>vex_num>>arc_num;pit->arcnum=arc_num;pit->vexnum=vex_num;//初始化权重for(int i=0;i<vex_num;i++){for(int j=0;j<vex_num;j++){pit->tyust[i][j]=INFINTY;}}cout<<"请输入所有顶点"<<endl;for(int i=0;i<vex_num;i++){cin>>pit->vex[i];}for(int j=0;j<arc_num;j++){cout<<"请输入边和权重"<<j+1<<endl;cin>>in1>>in2>>my_weiget;p1=get_pos(pit,in1);p2=get_pos(pit,in2);pit->tyust[p1][p2]=pit->tyust[p2][p1]=my_weiget;}print(pit);return pit;
}/*
克鲁斯卡尔算法
*/
void Kruskal(Graph my_map)
{side se[MAX_SIZE];//存储边的信息int my_set[MAX_SIZE],k=0,number=0;//边数int temp,j;/*按照升序排列边*/for(int i=0;i<my_map->vexnum;i++){for(int j=i+1;j<my_map->vexnum;j++)//只寻找邻接矩阵的上半三角就欧克{if(my_map->tyust[i][j]<INFINTY)//说明边连线存在{k=number-1;//下面有用处while(k>=0)//一直寻找,返回插入点k{if(se[k].weiget>my_map->tyust[i][j])//权重判断{se[k+1]=se[k];//如果权重大,就将它后移k--;//把游标指向上一个}else  break;}se[k+1].a=i;se[k+1].b=j;se[k+1].weiget=my_map->tyust[i][j];number++;//边数加一}}}///打印出se[]///for(int i=0;i<number;i++){printf("se[%d],a,b,weiget\n",i,se[i].a,se[i].b,se[i].weiget);}初始化my_set[],先指向自己///for(int j=0;j<my_map->vexnum;j++){my_set[j]=j;}cout<<"生成树边:"<<endl;k=0;j=0;while(k<my_map->vexnum-1)//n个顶点需要n-1条边{if(my_set[se[j].a]!=my_set[se[j].b])//如果一条边的两个顶点不都在集合中{//j=0,从最小边开始cout<<my_map->vex[se[j].a]<<"-"<<my_map->vex[se[j].b]<<endl;temp=my_set[se[j].b];for(int i=0;i<my_map->vexnum;i++)//对所有顶点{if(my_set[i]==temp){my_set[i]=my_set[se[j].a];}}k++;//已有边数加一}j++;}
}
int main()
{Graph my_map=creat_graph();Kruskal(my_map);return 0;
}

 

这篇关于克鲁斯卡尔-最小生成树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/599512

相关文章

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

python如何生成指定文件大小

《python如何生成指定文件大小》:本文主要介绍python如何生成指定文件大小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python生成指定文件大小方法一(速度最快)方法二(中等速度)方法三(生成可读文本文件–较慢)方法四(使用内存映射高效生成

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

SpringBoot实现二维码生成的详细步骤与完整代码

《SpringBoot实现二维码生成的详细步骤与完整代码》如今,二维码的应用场景非常广泛,从支付到信息分享,二维码都扮演着重要角色,SpringBoot是一个非常流行的Java基于Spring框架的微... 目录一、环境搭建二、创建 Spring Boot 项目三、引入二维码生成依赖四、编写二维码生成代码五

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

PyQt5+Python-docx实现一键生成测试报告

《PyQt5+Python-docx实现一键生成测试报告》作为一名测试工程师,你是否经历过手动填写测试报告的痛苦,本文将用Python的PyQt5和python-docx库,打造一款测试报告一键生成工... 目录引言工具功能亮点工具设计思路1. 界面设计:PyQt5实现数据输入2. 文档生成:python-

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、