#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;
}
__3.6.1 最小生成树—普里姆算法
猜你喜欢
转载自blog.csdn.net/qq_40843865/article/details/89225057
今日推荐
周排行