__3.6.1 最小生成树—普里姆算法

#include "pch.h"
#include "__0 Basic_operation.h"
#include <iostream>
#include <vector>


/*Prim算法生成最小生成树*/
void MiniSpanTree_Prim(const MGraph& G)
{
	vector<int> adjvex(G.numVertexes, 0);	//保存相关顶点下标,初始化都为V0的下标 [0, 4, 0, .....]表示V1 V4有联系
	vector<int> lowcost(G.numVertexes, 0);	//保存相关顶点间边的权值
	adjvex[0] = 0;		//初始化第一个顶点下标为0
	lowcost[0] = 0;		/*初始化第一个权值为0,即v0加入生成树*/
						/*lowCost的值为0,代表此下表的顶点已加入生成树*/
	for (int i = 1; i < G.numVertexes; ++i)
		lowcost[i] = G.arcs[0][i];		//将v0顶点与之有边的权值存入数组
	
	for (int i = 1; i < G.numVertexes; ++i) {
		int min = myINFINITY;	//记录最小权值
		int k = 0;		//记录最小权值下标
		for (int j = 1; j < G.numVertexes; ++j) {
			if (lowcost[j] < min && lowcost[j] != 0) {
				min = lowcost[j];
				k = j;
			}
		}
		std::cout << "(" << adjvex[k] << "," << k << ")  weight:" << lowcost[k] << "\n";		//打印当前顶点中权值最小边
		lowcost[k] = 0;		//将当前顶点权值设置为0,表示此顶点已经完成任务
		for (int j = 1; j < G.numVertexes; ++j) {
			/*通过迭代法使lowcost[j]始终保存第j个顶点与现有连通分量的最小权值*/
			if (lowcost[j] != 0 && G.arcs[k][j] < lowcost[j]) {
				lowcost[j] = G.arcs[k][j];		//将较小权值存入lowcost
				adjvex[j] = k;		//将下标为k的顶点存入adjvex
			}
		}
	}
}

int main() {
	/*  P245无向网				   0   1   2   3   4   5   6   7   8  */
	vector<vector<EdgeType>> vv{ { 0, 10,  N,  N,  N, 11,  N,  N,  N},
								 {10,  0, 18,  N,  N,  N, 16,  N, 12},
								 { N, 18,  0, 22,  N,  N,  N,  N,  8},
								 { N,  N, 22,  0, 20,  N, 24, 16, 21},
								 { N,  N,  N, 20,  0, 26,  N,  7,  N},
								 { 1,  N,  N,  N, 26,  0, 17,  N,  N},
								 { N, 16,  N, 24,  N, 17,  0, 19,  N},
								 { N,  N,  N, 16,  7,  N, 19,  0,  N},
								 { N, 12,  8, 21,  N,  N,  N,  N,  0} };
	MGraph G;
	CreateMGraphByArray(G, vv, 0);	//传入 0 表示无向图

	ShowMGraph(G);
	std::cout << "\n普里姆算法的最小生成树: \n";
	MiniSpanTree_Prim(G);
	std::cout << std::endl << std::endl;

	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40843865/article/details/89225057
今日推荐