C语言Kruskal算法求最小生成树

Kruskal算法求出最小生成树。

图形

在这里插入图片描述


算法描述

先找最小权值边为1的边有(V1,V4),(V2,V9),保证不产生回路就可以成功选择边

在这里插入图片描述

除去上一次找的边后,在找权值最小的边为2的有(V2,V3),(V4,V3),(V5,V6),(V9,V8),连接不产生回路的边

在这里插入图片描述

除去之前找过的边,后面再看权值最小的边为3的边有(V1,V3),(V7,V8),(V9,V7)
按顺序判断(V1,V3)边会产生回路排除,(V7,V8)可选边,当连接完(V7,V8)后判断(V9,V7)连接会造成回路排除

在这里插入图片描述

排除找过的边后,找下一个权值最小的为4的边有(V6,V7),(V9,V6)
顺序判断,( V6,V7)符合,连接完(V9,V6)判断连接(V9,V6)是回路不符合

在这里插入图片描述

完成所以点相连结束
有N个点,最小生成树有N-1个边

在这里插入图片描述


C语言Kruskal算法实现
//C语言Kruskal算法实现
#include<stdio.h>
#define M 1000//M表示无穷用1000代替
#define N 9 //N行N列的矩阵void loop(int arr[N][N],int dot,int c[N],int* count)
{int i;c[*count] = dot;*count = *count + 1;for ( i = 0; i < N; i++){if (arr[dot][i] == 1){ int flage = 1;for (int j = 0; j < *count; j++){if (i == c[j]){flage = 0;break;}}if(flage){ loop(arr, i, c,count);}}}
}
//标记和判断是否为回路,不是回路返回1,是回路反回0
int Is(int arr[N][N], int row, int column)
{if (arr[row][column] == 0 || arr[column][row] == 0){int a[N] = { 0 };int b[N] = { 0 };loop(arr, row, a);loop(arr, column, b);int flag = 1;for (int i = 0; i < N; i++){for (int j = 0; j < N; j++){if (a[i] == b[j] && a[i] !=0)flag = 0;}}//没产生回路标记1if(flag){ arr[row][column] = 1;arr[column][row] = 1;return 1;}//产生回路标记-1	else{arr[row][column] = -1;arr[column][row] = -1;	}}return 0;
}
int main()
{//把上图权值对应值写成邻接阵int map[N][N] ={{M,6,3,1,M,M,M,M,M},{6,M,2,M,M,M,M,M,1},{3,2,M,2,M,M,M,M,M},{1,M,2,M,10,M,M,M,M},{M,M,M,10,M,2,M,M,6},{M,M,M,M,2,M,4,M,4},{M,M,M,M,M,4,M,3,3},{M,M,M,M,M,M,3,M,2},{M,1,M,M,6,4,3,2,M}};int arr[N][N] = { 0 };//用来标记边int count = 0;//用来记录边的数量,最小生成树的边为数N-1int i = 0, j = 0;int min = M;//记录最小权值int value = 0;//当前要找的最小权值int sum = 0;//记录总权值//打印printf("最小生成树连接的边分别为:\n");while (1){min = M;//每次把最小权设置为最大//找权值最小边,和最小权值边的数量for (i = 0; i < N; i++){for (j = 0; j < N; j++){if (map[i][j] < min && map[i][j] > value)//判断是否为最小权{min = map[i][j];}}}value = min;//根据前面循环得到最小权值边,标记不构成回路的边for (i = 0; i < N; i++){for (j = 0; j < N; j++){if (map[i][j] == min && Is(arr, i, j)){//打印printf("权值为%d,连接V%d,V%d\n", value, i + 1, j + 1);sum += min;count++;if (count == (N - 1))break;}}if (count == (N - 1))break;}//找够边数跳出循环if (count == (N - 1))break;}printf("最小生成树的权值总和为:%d\n",sum);return 0;
}

在这里插入图片描述

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

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

相关文章

制作AI问答机器人:从0到1的完整指南

在数字化转型的浪潮中&#xff0c;企业正追求更高效、智能的客户服务解决方案。AI问答机器人以其快速响应、全天候服务和持续学习的能力&#xff0c;成为了提升客户满意度和加速业务发展的关键工具。本文将深入探讨如何制作一个企业级的AI问答机器人&#xff0c;并强调其功能体…

OpenAI发表研究论文 介绍了一种逆向工程AI模型工作原理的方法

ChatGPT 开发商 OpenAI 构建人工智能的方法本周遭到了前员工的抨击&#xff0c;他们指责该公司利用可能有害的技术冒不必要的风险。今天&#xff0c;OpenAI 发布了一篇新的研究论文&#xff0c;目的显然是为了表明它在通过提高模型的可解释性来应对人工智能风险方面的认真态度。…

hot100 -- 二分查找

目录 前言 &#x1f382;搜索插入位置 &#x1f33c;搜索二维矩阵 &#x1f33c;排序数组元素第一和最后一个位置 &#x1f33c;旋转排序数组 &#x1f4aa;旋转排序数组中的最小值 &#x1f4aa;两个正序数组的中位数 前言 二分算法学习_时间超限ac:0%-CSDN博客 &#…

2024年【起重机械指挥】考试及起重机械指挥新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机械指挥考试考前必练&#xff01;安全生产模拟考试一点通每个月更新起重机械指挥新版试题题目及答案&#xff01;多做几遍&#xff0c;其实通过起重机械指挥试题及解析很简单。 1、【多选题】《中华人民共和国特…

【Androi】安卓发展历程详解

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

git推送代码到github拒绝推送的解决方案

这里描述一下本地推送的场景&#xff0c;首先我在码云上建立了一个前端项目&#xff0c;进行了自己的个性化开发&#xff0c;后期在github上创建了一个一样的项目仓库存放代码。使用webstorm进行代码开发。在下面这个位置可以选择推送的代码位置。 选择推送github仓库之后&…

Python深度学习基于Tensorflow(16)基于Tensorflow的对话实例

文章目录 基础数据清洗数据生成词汇表定义分词器并制作数据集构建Transformer模型并训练模型推理 Tensorflow 的核心就是注意力机制&#xff0c;在之前详细的介绍过&#xff0c;具体可以看这个&#xff1a;Python深度学习基于Tensorflow&#xff08;9&#xff09;注意力机制_te…

在Java中为什么对a赋值为10,在进行a++时还是等于10呢

首先我们看这样一组代码 public class demo1 {public static void main(String[] args) {int a10;aa;System.out.println(a);} } 结果&#xff1a;10不是在第二步有a操作吗&#xff1f;为什么还是10呢&#xff1f; a的执行步骤如下&#xff1a; 保存当前a的值&#xff08;即10…

websocket链接携带参数

前端创建链接时官方提供的构造函数 var aWebSocket new WebSocket(url, [protocols]); url&#xff1a;要连接的URL&#xff1b;这应该是WebSocket服务器将响应的URL。 protocols&#xff1a;可选&#xff1b;一个协议字符串或者一个包含协议字符串的数组。这些字符串用于指定…

智能语音电销机器人可以做哪些事情?ai语音机器人系统

智能语音电销机器人软件的出现&#xff0c;给很多企业都带来了福利&#xff0c;尤其是电销企业&#xff0c;不仅工作效率提升了&#xff0c;成本降低了&#xff0c;还能实现智能化管理客户的出现&#xff0c;给很多企业都带来了福利&#xff0c;尤其是电销企业&#xff0c;不仅…

python初学者笔记(八)——数字阶乘

#python初学者笔记&#xff08;8&#xff09;——数字阶乘 阶乘是基斯顿卡曼于 1808 年发明的运算符号,是数学术语,一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积。 下面利用Python编写数字阶乘 ##1.方法一:利用函数的方法&#xff0c;求输入值的阶乘 #coding…

WebAPI 前端开发流程:深度解析与实践探索

WebAPI 前端开发流程&#xff1a;深度解析与实践探索 在前端开发的世界里&#xff0c;WebAPI扮演着至关重要的角色&#xff0c;它作为前端与后端沟通的桥梁&#xff0c;确保了数据的流畅传输与功能的完整实现。本文将详细探讨WebAPI前端开发流程&#xff0c;从四个方面、五个方…

什么情况下需要配戴助听器

以下几种情况需要考虑配戴助听器&#xff1a; 1、听力无波动3个月以上的感音神经性听力障碍。如:先天性听力障碍、老年性听力障碍、噪声性听力障碍、突聋的稳定期等&#xff0c;均可选配合适的助听器。 2、年龄方面。使用助听器没有严格的年龄限制&#xff0c;从出生数周的婴…

深度学习Week16——数据增强

文章目录 深度学习Week16——数据增强 一、前言 二、我的环境 三、前期工作 1、配置环境 2、导入数据 2.1 加载数据 2.2 配置数据集 2.3 数据可视化 四、数据增强 五、增强方式 1、将其嵌入model中 2、在Dataset数据集中进行数据增强 六、训练模型 七、自定义增强函数 一、前言…

Geoserver源码解读一(环境搭建)

一、Github地址 https://github.com/geoserver/geoserver 1.1 克隆代码 git clone https://github.com/geoserver/geoserver.git 1.2 选择版本 版本选择参考我的上一篇文章 Geoserver 以及 Geotools各版本和jdk版本对照表 此处我选择的是兼容jdk8的最后一个版本 git che…

netty+springboot+vue聊天室(需要了解netty)

先看看这个使用websocket实现的聊天室&#xff0c;因为前端是使用websocket&#xff0c;和下面的demo的前端差不多就不解释实现原理&#xff0c;所以建议还是看看(要是会websocket的大佬请忽略) springbootwebsocketvue聊天室 目录 一、实现内容二、代码实现1.后端2.前端源码…

html+CSS+js部分基础运用17

在图书列表中&#xff0c;为书名“零基础学JavaScript”和“HTML5CSS3精彩编程200例”添加颜色。&#xff08;请用class或style属性实现&#xff09;&#xff0c;效果如下图1所示&#xff1a; 图1 图书列表 Class和style的综合应用。&#xff08;1&#xff09;应用class的对象、…

命令行打包最简单的android项目从零开始到最终apk文件

准备好需要的工具 AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 jdk的链接我就不发出来,自己选择,我接下来用的是8版本的jdk和android10的sdk sdk的安装和环境变量的配置 sdk tool压缩包打开后是这样子,打开sdk mana…

高防CDN是如何应对DDoS和CC攻击的

高防CDN&#xff08;内容分发网络&#xff09;主要通过分布式的网络架构来帮助网站抵御DDoS&#xff08;分布式拒绝服务&#xff09;和CC&#xff08;挑战碰撞&#xff09;攻击。 下面是高防CDN如何应对这些攻击的详细描述&#xff1a; 1. DDoS攻击防护 DDoS攻击通过大量的恶…

SREC用什么软件编程:全面解析与编程工具选择

SREC用什么软件编程&#xff1a;全面解析与编程工具选择 在嵌入式系统开发中&#xff0c;SREC文件格式扮演着至关重要的角色&#xff0c;用于存储和传输二进制数据。然而&#xff0c;对于许多初学者和开发者来说&#xff0c;如何选择合适的软件来编写SREC文件却是一个令人困惑…