Prim算法求最小生成树模板代码C++

先定义MAXV为最大顶点数、INF为一个很大的数字:

const int MAXV = 1000;//最大顶点数
const int INF = 1000000000;//设INF为一个很大的数

邻接矩阵版

int n, G[MAXV][MAXV];//n为顶点数,MAXV为最大顶点数
int d[MAXV];//顶点与集合S的最短距离
bool vis[MAXV] = { false };//标记数组,vis[i]==true表示已访问。初值均为false

int prim() {//默认0号为初始点,函数返回最小生成树的边权之和
	fill(d, d + MAXV, INF);//fill函数将整个d数组赋为INF
	d[0] = 0;//只有0号顶点到集合S的距离为0,其余全为INF
	int ans = 0;//存放最小生成树的边权之和
	for (int i = 0; i < n; i++) {//循环n次
		int u = -1, MIN = INF;//u使d[u]最小,MIN存放该最小的d[u]
		for (int j = 0; j < n; j++) {//找到未访问顶点中d[]最小的
			if (vis[j] == false && d[j] < MIN) {
				u = j; MIN = d[j];
			}
		}
		//找不到小于INF的d[u],则剩下的顶点和集合S不连通
		if (u == -1) return -1;
		vis[u] = true;//标记u为已访问
		ans += d[u];//将与集合S距离最小的边加入最小生成树
		for (int v = 0; v < n; v++) {
			if (vis[v] == false && G[u][v] != INF && G[u][v] < d[v]) {
				d[v] = G[u][v];//将G[u][v]赋值给d[v]
			}
		}
	}
	return ans;//返回最小生成树的边权之和
}

邻接表版

struct Node
{
	int v, dis;//v为边的目标顶点,dis为边权
};

vector<int> Adj[MAXV];//图G,Adj[u]存放从顶点u出发可以到达的所有顶点

int n;//n为顶点数,MAXV为最大顶点数
int d[MAXV];//顶点与集合S的最短距离
bool vis[MAXV] = { false };//标记数组,vis[i]==true表示已访问。初值均为false

int prim() {//默认0号为初始点,函数返回最小生成树的边权之和
	fill(d, d + MAXV, INF);//fill函数将整个d数组赋为INF
	d[0] = 0;//只有0号顶点到集合S的距离为0,其余全为INF
	int ans = 0;//存放最小生成树的边权之和
	for (int i = 0; i < n; i++) {//循环n次
		int u = -1, MIN = INF;//u使d[u]最小,MIN存放该最小的d[u]
		for (int j = 0; j < n; j++) {//找到未访问顶点中d[]最小的
			if (vis[j] == false && d[j] < MIN) {
				u = j; MIN = d[j];
			}
		}
		//找不到小于INF的d[u],则剩下的顶点和集合S不连通
		if (u == -1) return -1;
		vis[u] = true;//标记u为已访问
		ans += d[u];//将与集合S距离最小的边加入最小生成树
		for (int j = 0; j < Adj[u].size(); j++) {
			int v = Adj[u][j].v;//通过邻接表直接获得u能到达的顶点v
			if (vis[v] == false && Adj[u][j].dis < d[v]) {///如果v未访问&&以u为中介点可以使v离集合S更近
				d[v] = Adj[u][j].dis;
			}
		}
	}
	return ans;//返回最小生成树的边权之和
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一匹好人呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值