Prim算法(C++)

目录

介绍:

代码:

结果:

介绍:

Prim算法是一种用于解决最小生成树问题的贪心算法。该算法的主要思想是从一个顶点开始,不断向图中添加边,直到构成一棵包含所有顶点的生成树,使得树的边权之和最小。

具体来说,Prim算法的过程如下:

  1. 选择一个起始点,将其加入生成树中。

  2. 若生成树中已经包含所有顶点,则算法结束;否则,从与生成树相邻的所有边中选择一条边权最小的边,将其加入生成树中。

  3. 重复步骤2,直到生成树包含所有顶点。

需要注意的是,Prim算法要求构成的图必须是连通的。若原图不连通,则需要对每个连通分量分别运行Prim算法。此外,Prim算法的时间复杂度为O(E*logV),其中E为边数,V为顶点数。

代码:

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;
typedef struct node
{
	int adjvex;//与之相连最小权值边的另一顶点
	int w;//权值
}node;
int g [100][100];
int n, e;
node closedge[100];
void prim(int u)
{
	for (int i = 1; i <= n; i++)
		if (i != u)
			closedge[i] = { u, g[u][i] };//初始化closedge
	closedge[u].w = 0;//为零表示已经访问过,加入已访问集合
	for (int j = 1; j < n; j++)
	{
		int min = 999;
		int v;
		for (int i = 1; i <= n; i++)//找closedge中权值最小的边
		{
			if (closedge[i].w != 0 && closedge[i].w < min)
			{
				min = closedge[i].w;
				u = i;
			}
		}
		v = closedge[u].adjvex;
		cout << u << " " << v << endl;//输出权值最小的边
		closedge[u].w = 0;//加入已访问集合
		for (int i = 1; i <= n; i++)//加入新顶点后,更新closedge
		{
			if (g[u][i] < closedge[i].w)
				closedge[i] = { u,g[u][i] };
		}
	}
}
int main()
{
	cout << "输入顶点数和边数:" << endl;
	cin >> n >> e;
	for (int i = 1; i <= n; i++)//初始化矩阵
		for (int j = 1; j <= n; j++)
			g[i][j] = 999;
	cout << "输入边和权值:" << endl;
	for (int i = 0; i < e; i++)
	{
		int v1, v2, w;
		cin >> v1 >> v2>>w;
		g[v1][v2] = w;
		g[v2][v1] = w;//无向图
	}
	cout << endl;
	cout << "prim最小生成树:" << endl;
	prim(1);//从1点开始
}

结果:

相关推荐
·心猿意码·9 小时前
C++ 链接陷阱与底层溯源:ODR、inline 与匿名命名空间的那些坑
c++
金刚狼889 小时前
UUID和Name不在同一条BLE广播报文里
c++·windows
wanderist.9 小时前
从Nim游戏到SG函数
c++·算法·蓝桥杯
数据皮皮侠9 小时前
2285 上市公司组织衰退程度【Dec】2010-2024
大数据·人工智能·算法·制造
daxi15010 小时前
C语言从入门到进阶——第17讲:字符串函数
c语言·开发语言·算法·蓝桥杯
967710 小时前
C++ 内存管理的核心——RAII 机制。两种锁 lock_guard, unique_lock
java·jvm·c++
wljy110 小时前
第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(个人见解,已完结)
c语言·c++·算法·蓝桥杯
CoderCodingNo10 小时前
【GESP】C++八级考试大纲知识点梳理 (7) 算法的时间和空间效率分析
开发语言·c++·算法
程序员zgh10 小时前
C++ 环形队列 从原理到实例演示
c语言·开发语言·数据结构·c++·学习
誰能久伴不乏10 小时前
从数字世界到物理引擎:用 PWM 撕开 0 和 1 的结界
linux·arm开发·c++·qt