最小生成树算法

简介:
#include <stdio.h>
#include <string.h>

#define INFINITY 1000000    // 无穷大
#define MAX_VERTEX_COUNT 6 // 图最多顶点数

// 图的邻接矩阵
typedef int Graph[MAX_VERTEX_COUNT][MAX_VERTEX_COUNT];

/************************************************************************/
/* 功能:用Prim算法实现构造最小生成树
/* 参数:g--图 
/*       vertexCount -- 图的顶点数
/*       father -- 记录顶点的双亲
/************************************************************************/
void Prim(Graph g, int vertexCount, int father[])
{
	int i, j, k;
    int lowCost[MAX_VERTEX_COUNT]; // 记录从U到V-U具有最小代价的边
	int closeSet[MAX_VERTEX_COUNT];// 记录了该边依附的在U中的顶点,v属于V-U 
	int used[MAX_VERTEX_COUNT];    // 记录顶点是否已经被选中放入到U集合中
	int min;

	// 这里初始选中顶点为1号顶点,这是可以修改的,本程序以1号顶点为默认
	for (i = 0; i < vertexCount; i++)
	{
		// 最短距离初始化为其他节点到1号节点的距离
		lowCost[i] = g[0][i];

		// 标记所有节点的依附点皆为默认的1号节点
		closeSet[i] = 0;

		// 所有顶点均未被选中到U集合中
		used[i] = 0; 

		// U集合中还没有顶点,所有值设为-1,表示无双亲
		father[i] = -1;
	}

	used[0] = 1; // 1号顶点选中,并加入到集合U中
	// 依次选取剩余顶点加入到集合中
	for (i = 1; i < vertexCount; i++)
	{
		j = 0;
		min = INFINITY;

		// 找满足条件的最小权值边的顶点k及其编号
		for (k = 1; k < vertexCount; k++)
		{
			// 边权值较小且不在生成树中
			if (!used[k] && lowCost[k] < min)
			{
				min = lowCost[k]; // 选中顶点
				j = k;
			}
		}
		father[j] = closeSet[j]; // 记录j号顶点的双亲
		used[j] = 1; // 将j号顶点选入到生成树中

		// 打印边即打印该边连接的两个顶点(权值最小)
		printf("%d %d\n",j + 1,closeSet[j] + 1);

		for (k = 1; k < vertexCount; k++)
		{
			// 继续找边权值更小的顶点
			if (!used[k] && g[j][k] < lowCost[k])
			{
				lowCost[k] = g[j][k]; // 更新最小权值
				closeSet[k] = j; // 记录新的依附点
			}
		}
	}

}


int main()
{
	int i, j, weight;
    Graph g;
    int father[MAX_VERTEX_COUNT];
	int vertexCount;

	for (i = 0; i < MAX_VERTEX_COUNT; i++)
	{
		for (j = 0; j < MAX_VERTEX_COUNT; j++)
		{
			g[i][j] = INFINITY;
		}
	}

	// 构造图
	while (scanf("%d%d%d", &i, &j, &weight) != EOF)
	{
		// 无向图是对称的
		g[i - 1][j - 1] = weight;
		g[j - 1][i - 1] = weight;
	}

	Prim(g, 6, father);

	return 0;
}

目录
相关文章
|
4月前
|
算法 索引
class061 最小生成树【算法】
class061 最小生成树【算法】
44 0
|
6月前
|
算法
最小生成树算法:Prim算法
在图论中,最小生成树(Minimum Spanning Tree,简称MST)是一种常用的算法问题。最小生成树是指在一个加权连通图中选取边的子集,使得所有顶点都被覆盖,并且边的总权值最小。
159 0
|
8天前
|
存储 机器学习/深度学习 算法
上机实验三 图的最小生成树算法设计 西安石油大学数据结构
上机实验三 图的最小生成树算法设计 西安石油大学数据结构
17 1
|
2月前
|
算法 Java C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-6 算法训练 安慰奶牛 最小生成树
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-6 算法训练 安慰奶牛 最小生成树
23 0
|
5月前
|
算法 C++
用prim和kruskal算法求最小生成树问题
用prim和kruskal算法求最小生成树问题
47 0
|
8月前
|
存储 算法 C++
最小生成树问题及Kruskal算法的解析
最小生成树问题及Kruskal算法的解析
71 2
|
10月前
|
算法 容器
【算法入门&图论】【模板】拓扑排序|【模板】单源最短路2 |最小生成树(下)
【算法入门&图论】【模板】拓扑排序|【模板】单源最短路2 |最小生成树
80 0
|
10月前
|
存储 算法 UED
【算法入门&图论】【模板】拓扑排序|【模板】单源最短路2 |最小生成树(上)
【算法入门&图论】【模板】拓扑排序|【模板】单源最短路2 |最小生成树
50 0
|
10月前
|
算法 C++ Python
最小生成树算法
最小生成树算法
74 0
|
10月前
|
算法 Java
数据结构(13)最小生成树JAVA版:prim算法、kruskal算法
13.1.概述 最小生成树,包含图的所有顶点的一棵树,树的边采用包含在图中的原有边中权重和最小的边。翻译成人话就是遍历一遍全图所有顶点的最短路径,这条路径就叫最小生成树。 最小生成树存在和图是连通图互为充要条件,顶点都不连通,肯定不可能有路能遍历一遍全图。 求解最小生成树有两种常用算法:
107 0

热门文章

最新文章