首页 > 编程语言 >C语言Kruskal算法求最小生成树

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

时间:2024-06-04 23:30:49浏览次数:52  
标签:arr int Kruskal 回路 最小 C语言 算法 权值 row

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 i;
	for ( i = 0; i < N; i++)
	{
		if (arr[dot][i] == 1)
			c[i] = i + 1;
	}
}
//标记和判断是否为回路,不是回路返回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;
			}
		}
		//没产生回路标记1
		if(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-1
	int 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;
}

在这里插入图片描述

标签:arr,int,Kruskal,回路,最小,C语言,算法,权值,row
From: https://blog.csdn.net/2401_83305953/article/details/139456342

相关文章

  • [轨迹规划实操] 横向优化算法+纵向DP算法的python复现(2)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言纵向速度规划1.对路程和时间进行采样2.计算代价函数3.选出最小代价的点进行回溯4.实验结果前言本文采用基于优化的横向规划方法和基于动态规划的纵向规划方法横向优化控制详见第一......
  • 代码随想录算法训练营第四天 |节点交换、删除倒数n个节点、交叉链表、环形链表
    24题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/description/24题代码随想录讲解:https://programmercarl.com/0024.两两交换链表中的节点.html#思路19题链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/19题代码随想录:https://programmerca......
  • C语言第三篇-数组
    数组定义数组是一组相同类型元素的集合;也就是一组数。数组的创建方式chararr3[10];//char是指数组的元素类型;10是一个常量表达式,用来指定数组的大小floatarr4[5];//float是指数组的元素类型;5是一个常量表达式,用来指定数组的大小doublearr5[2......
  • 【数据结构与算法 经典例题】链表的回文结构(图文详解)
                  ......
  • C语言数据结构实现-顺序表基本操作
    顺序表,全名顺序存储结构,是线性表的一种。通过《什么是线性表》一节的学习我们知道,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。不仅如此,顺序表对数据的物理存储结构也有要求。顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时......
  • 无人机航迹规划:人工原生动物优化算法APO求解无人机路径规划MATLAB
    一、无人机模型介绍单个无人机三维路径规划问题及其建模_无人机路径规划场景建模-CSDN博客参考文献:[1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120二、人工原生动物优化算法APO求解无人机路径规划人工原生动物......
  • 【机器学习算法】降维
    降维算法是数据预处理中的一种技术,主要用于减少数据集中的特征数量,同时尽可能保留原始数据的重要信息。数模掌握线性降维方法就已经很强了。目录线性降维方法主成分分析(PCA)线性判别分析(LDA)非线性降维方法基于核函数的非线性降维方法基于特征值的非线性降维方法(流型......
  • 【机器学习算法】回归算法(下) #一文归纳众多算法,建议收藏
    本文介绍一些传统的机器学习中的有监督算法,然后讲一下集成算法,并给出一张各种算法的“谱系”图。同时,本文对很多算法都给出了示意图系列文章目录【机器学习概念】【机器学习流程】【机器学习算法】回归算法(上)【机器学习算法】回归算法(中)目录SVM(支持向量机)软边界和......
  • 扫雷游戏(C语言)(超详细!新手小白入!)
    扫雷游戏详细过程一.前言二.游戏的分析和设计1.厘清整体思路2.棋盘的构建与思路3.初始化及打印棋盘4.布置雷5.排查雷三.扫雷游戏的扩展一.前言游戏介绍这是一款经典的扫雷游戏,玩家可以任意点击一个小方框,若不是雷,则会显示周边有几个雷,并把雷的个数显示出来,若是雷,......
  • 【每日一算法】所有元素的 最大值 和 最大公约数 相等
    题目描述Silencer76 定义一个序列是好序列,当且仅当序列中所有元素的最大值和最大公约数相等。给定一个长度为 n的正整数序列 a,请找出最长的符合好序列定义的子序列,输出它的长度。输入描述:输出描述:示例一输入512321输出2示例说明:根据题意,子序......