#include "pch.h"
#include "__0 Basic_operation.h"
#include <iostream>
#include <vector>
/*Kruskal算法查找连线顶点的尾部下标*/
int Find(const vector<int>& parent, int f) {
while (parent[f] > 0)
f = parent[f];
return f;
}
/*Kruskal算法生成最小生成树*/
void MiniSpanTree_Kruskal(const vector<EdgeArray>& edges, int numVertexes)
{
//定义一个数组用来判断边与边是否构成环路
vector<int> parent(numVertexes, 0); //初始化数组初始值为0
/*循环每一条边*/
for (int i = 0; i < edges.size(); ++i) {
int n = Find(parent, edges[i].begin);
int m = Find(parent, edges[i].end);
if (n != m) { //假如n与m不等,说明此边没有与现有生成树形成回路
parent[n] = m; //将此边的结尾顶点放入下标为起点的parent中,表示此顶点已经在生成树集合中
std::cout << "(" << edges[i].begin << "," << edges[i].end << ") weight:" << edges[i].weight << std::endl;
}
}
}
int main() {
/* P252无向网 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 表示无向图
vector<EdgeArray> edges; //定义边集数组
/*将邻接矩阵G转化为边集数组Edges并按权值大小有小到大排序*/
CreateEdgArrByGrraph(G, edges);
ShowEdgArr(edges);
std::cout << "\n克鲁斯卡尔算法生成最小生成树: \n";
MiniSpanTree_Kruskal(edges, G.numVertexes); //传入边集数组和顶点个数
return 0;
}
__3.6.2 最小生成树—克鲁斯卡尔算法
猜你喜欢
转载自blog.csdn.net/qq_40843865/article/details/89225067
今日推荐
周排行