Prim算法保姆式讲解——图的最小生成树

由于代码的注释已经非常非常详细了,我就直接上代码了。

下图是帮助理解的

Prim算法保姆式讲解——图的最小生成树_第1张图片

#include"bits/stdc++.h"
using namespace std;
const int MAXVEX = 9;//假设邻接矩阵就是9*9的
const int INFINITE = 6335;//这个可以根据情况自己假设,即不可能出现的权值,当然具体代码怎么弄,比如我这里利用小于,需要大家自己设置
const int _done = 7777;//表示这个边已经被选过之后赋的一个值
//下面是邻接矩阵
typedef struct
{
	int vexs[MAXVEX]; /* 顶点表 */
	int arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */
	int numNodes, numEdges; /* 图中当前的顶点数和边数  */
}MGraph;
//这里假设Numnodes=9
//假设G这个矩阵里面两个点间若没有边就赋值为INFINITE

 邻接矩阵详解——图(graph)的基础知识详解_chy响当当的博客-CSDN博客

void MinCreateTree(MGraph G)
{
	int selectvex[MAXVEX];//我们需要一个顶点数组,代表是否已经被选入最小生成树中;
	memset(selectvex, -1, MAXVEX);//全部初始化为-1,表示没有选进去,如果等于1就代表被选了
	int lowarc[MAXVEX];//我们需要一个数组存与顶点相关的边上的权值,然后我们要挑出最小的权值
	//下面这个要注意了:我们知道一个边有两个顶点,所以需要一个parent数组来记录,一个顶点和谁连在一起,作为一颗树,也就是子节点要知道他的父母在哪里
	int parent[MAXVEX];
	memset(parent, -1, MAXVEX);//全部初始化为-1,最后其实只有根节点我这里取0号他的parent是-1,其他都是012345678里面挑
	//对于生成树,随便取一个顶点作为顶点,根据上图,我们不妨取0号顶点
	selectvex[0] = 1;
	lowarc[0] = _done;//同时初始化它的权值为0
	//根据G邻接矩阵里面的权的数据,读入Lowarc,但是现只要读0这一行即可,因为在下面的while循环里面,
	for (int i = 1; i < G.numNodes; i++)
	{
		lowarc[i] = G.arc[0][i];
		if (lowarc[i] != INFINITE)
		{
			parent[i] = 0;//只要读0这一行,自然弧尾是0了
		}
	}
	//接下来就要构建循环
	for (int i = 0; i < G.numNodes; i++)
	{
		int min = INFINITE;//用来比较出最小的权值
		int j = 1;//j用来搜索和顶点相关的边
		int k = 0;//存下标
		while (j < G.numNodes)
		{
			//一个需要邻接矩阵中这条边存在,一个需要没被用过,一个需要找最小权值
			if (lowarc[j] != _done&&lowarc[j]

同时推荐一个ppt最小生成树(Kruskal(克鲁斯卡尔)和Prim(普里姆))算法动画演示_哔哩哔哩_bilibili

你可能感兴趣的:(算法学习,算法,c++,数据结构)