最小生成树之Kruskal和Prim算法——C++实现

本文介绍了使用C++实现Kruskal和Prim算法来找到图的最小生成树。Kruskal算法侧重合并,Prim算法涉及吞并和优先级队列。文章提供了算法的输入和输出说明,并提供了从文件读取数据的实现。
摘要由CSDN通过智能技术生成

很久以前就学过最小生成树之Kruskal和Prim算法,这两个算法很容易理解,但实现起来并不那么容易。最近学习了并查集算法,得知并查集可以用于实现上述两个算法后,我自己动手实现了最小生成树算法。

宏观上讲,Kruskal算法就是一个合并的过程,而Prim算法是一个吞并的过程,另外在Prim算法中还用到了一种数据结构——优先级队列,用于动态排序。由于这两个算法很容易理解,在此不再赘述。接下来给出我的源代码。

输入

第一行包含两个整数n和m,n表示图中结点个数,m表示图中边的条数;接下来m行,每一行包含三个整数u,v,w,表示途中存在一条边(u,v),并且其权重为w;为了便于调试,我的程序是从文件中输入数据的;

输出

输出程序选择的最小生成树的权值之和以及每一条边信息;

Kruskal算法:
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
using namespace std;

struct Edge
{
	int u; //边连接的一个顶点编号
	int v; //边连接另一个顶点编号
	int w; //边的权值
	friend bool operator<(const Edge& E1, const Edge& E2)
	{
		return E1.w < E2.w;
	}
};
//创建并查集
void MakeSet(vector<int>& uset, int n)
{
	uset.assign(n, 0);
	fo
  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值