__3.6.2 最小生成树—克鲁斯卡尔算法

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_40843865/article/details/89225067