C语言Prim算法和Prim-Alternat找最小生成树

2024-06-03 15:28

本文主要是介绍C语言Prim算法和Prim-Alternat找最小生成树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1、用prim算法求最小生成树
      • C语言Prim算法实现
    • 2、用Prim-Alternate算法求最小生成树
      • 3、C语言Prim-Alternate算法实现

1、用prim算法求最小生成树

绿色线会标记选过的边

在这里插入图片描述

从v1当作起始点开始,可选择:
(v1,v2)权值为6
(v1,v3)权值为3
(v1,v4)权值为1
从中选择边(v1,v4),最小权值为1
在这里插入图片描述

从v1和v4中选连接边,可选择的边有:
(v1,v2)权值为6
(v1,v3)权值为3
(v4,v3)权值为2
(v4,v5)权值为10
从中选择权值最小为2的边,(v4,v3)
在这里插入图片描述

v1,v4,v3已经被标记不能相互连接,避免产生回路,从v1、v4、v3中可选择的边有:
(v1,v2)权值为6
(v4,v5)权值为10
(v3,v2)权值为2
从中选择权值最小为2的边,(v3,v2)
在这里插入图片描述

从v1,v4,v3,v2中可选择的边有:
(v2,v9)权值为1
(v4,v5)权值为10
从中选择权值最小1的边,(v2,v9)
在这里插入图片描述

从v1,v4,v3,v2,v9中可选边有:
(v4,v5)权值为10
(v9,v5)权值为 6
(v9,v6)权值为 4
(v9,v7)权值为 3
(v9,v8)权值为 2
从中选择权值最小2的边,(v9,v8)
在这里插入图片描述

从v1,v4,v3,v2,v9,v8中可选边有:
(v4,v5)权值为10
(v9,v5)权值为 6
(v9,v6)权值为 4
(v9,v7)权值为 3
(v8,v7)权值为 3
从中有两条权值为3的边,任选一条(v8,v7)
在这里插入图片描述

从v1,v4,v3,v2,v9,v8,v7中可选边有:
(v4,v5)权值为10
(v9,v5)权值为 6
(v9,v6)权值为 4
(v7,v6)权值为 4
从两条权值为4的边,任选一条(v7,v6)
在这里插入图片描述

从v1,v4,v3,v2,v9,v8,v7,v6中可选边有:
(v4,v5)权值为10
(v9,v5)权值为 6
(v6,v5)权值为 2
选择最小权值为2的边(v6,v5)
在这里插入图片描述

v1,v4,v3,v2,v9,v8,v7,v6,v5所有点被标记
最小生成树找到,总权值为17
在这里插入图片描述

C语言Prim算法实现

#include<stdio.h>
#define M 1000//M表示无穷用1000代替
//判断标记点的函数,避免产生回路
int Is(int arr[9], int flag)
{int i = 0;for (i = 0; i < 9; i++){if (arr[i] == flag)return 0;}return 1;
}
int main()
{//把上图权值对应值写成邻接阵int map[9][9] ={{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[9] = { 1 };//设置初始点为V1,只有V1被标记//记录标记个数int count = 1;//存放权值总和int s = 0;//循环变量int i = 0;//记录最小权下标int index = 0;//记录最小权int min = M;//记录点int doc = 1;//循环部分:while (1){min = M;for (i = 0; i < count; i++){int j = 0;int c = arr[i] - 1;for (j = 0; j < 9; j++){if (map[c][j] <= min && Is(arr, j + 1)){doc = c + 1;min = map[c][j];index = j;}}}s += min;arr[count++] = index + 1;//打印printf("V%d --> V%d ", doc, index + 1);//所有点被标记,跳出循环if (count == 9)break;}printf("\n总权值为:%d\n", s);return 0;
}

运行结果:

在这里插入图片描述

2、用Prim-Alternate算法求最小生成树

Prim-Alternate算法是Prim算法的优化
Prim-Alternate算法是只找当前标记点和上一个标记点的邻边
被标记的点不能互相相连

3、C语言Prim-Alternate算法实现

//Prim-Alternate算法
#include<stdio.h>
#define M 1000//M表示无穷用1000代替
//判断标记点的函数,避免产生回路
int Is(int arr[9], int flag)
{int i = 0;for (i = 0; i < 9; i++){if (arr[i] == flag)return 0;}return 1;
}
int main()
{//把上图权值对应值写成邻接阵int map[9][9] ={{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[9] = { 1 };//设置初始点为V1,V1被标记//记录标记个数int count = 1;//存放权值总和int s = 0;//循环变量int i = 0;//记录最小权下标int index = 0;//记录最小权int min = M;//记录点int doc = 1;int c = 0;//循环部分:while(1){min = M;
//每次循环只找两个标记点相邻的边for(i=count-2;i< count ;i++){ int j = 0;if (count == 1)c = arr[0] - 1;elsec = arr[i] - 1;for (j = 0; j < 9; j++){if (map[c][j] <= min && Is(arr, j + 1)){doc = c+1;min = map[c][j];index = j;}}}s += min;arr[count++] = index + 1;//打印printf("V%d --> V%d ",doc , index + 1);//所有点被标记,跳出循环if (count == 9)break;		}printf("\n总权值为:%d\n", s);return 0;
}

运行结果:

在这里插入图片描述

这篇关于C语言Prim算法和Prim-Alternat找最小生成树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

Vue3 如何通过json配置生成查询表单

《Vue3如何通过json配置生成查询表单》本文给大家介绍Vue3如何通过json配置生成查询表单,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录功能实现背景项目代码案例功能实现背景通过vue3实现后台管理项目一定含有表格功能,通常离不开表单

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam