您的位置:首页 > 编程语言 > C语言/C++

c语言版本的最小生成树(Prim算法)概述

2019-07-22 09:49 232 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_40903237/article/details/96830022

1、Prim算法概述:图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。

 2、最小生成树:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。

3、重点部分代码段实现 

[code]//prim算法生成最小生成树
void MiniSpanTree_Prim(MGraph G){

int min,i,j,k;
int adjvex[MAXVEX]; //保存相关顶点下标
int lowcost[MAXVEX];//保存相关顶点间的权值
lowcost[0] = 0;     //v0作为最小生成树的根开始遍历,权值为0
adjvex[0] = 0;		//V0第一个加入

//初始化操作
for(int i = 1;i<G.numVertexes;i++){

lowcost[i] = G.arc[0][i]; //将领接矩阵的第0行所有权值先加入数组
adjvex[i] = 0;            //将全部初始化为v0的下标
}

//真正构造最小生成树的过程
for(int i = 1;i<G.numVertexes;i++){

min = INFINITY;		//初始化最小权值为65535等不可能的数值
j = 1;
k = 0;

//遍历全部顶点

while(j < G.numVertexes){

//找出lowcost数组已经存储的最小权值
if(lowcost[j]!=0 && lowcost[j] < min){
min = lowcost[j];
k = j; //将发现的最小权值的下标存入k,以待使用
}
j++;
}
}
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: