[C++]最小生成树--Prim算法&Kruskal算法

最小生成树–Prim算法&Kruskal算法

一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。(from 百度百科)

Prim算法

此算法采用贪心算法的思想,运行时间为O( n^2 )。

算法描述

基本步骤:

设R是有n个定点的对称连通关系。

  • 1)选取R的一个定点v1,设V = {v1}, E={}。
  • 2)选取与vj ∈ V邻接的V的最近邻元vi, 并且边(vi, vj)不与E中元素形成回路。添加vi到V中,添加(vi, vj)到E中。
  • 重复2),知道|E|=n - 1,于是V包含R的所有n个定点,E包含R的最小生成树。

矩阵描述

这里写图片描述

具体例子

这里写图片描述
这里写图片描述
这里写图片描述

代码思路

首先,要用二维数组记录点和权值。如上图所示无向图:

int map[7][7];
map[1][2]=map[2][1]=4;
map[1][3]=map[3][1]=2;
……

  然后再求最小生成树。具体方法是:

1.先选取一个点作起始点,然后选择它邻近的权值最小的点(如果有多个与其相连的相同最小权值的点,随便选取一个)。如1作为起点。

visited[1]=1;

pos=1;

//用low[]数组不断刷新最小权值,lowi的值为:i点到邻近点(未被标记)的最小距离。

low[1]=0; //起始点i到邻近点的最小距离为0

low[2]=map[pos][2]=4;

low[3]=map[pos][3]=2;

low[4]=map[pos][4]=3;

low[5]=map[pos][5]=MaxInt; //无法直达

low[6]=map[pos][6]=MaxInt;

2.再在伸延的点找与它邻近的两者权值最小的点。

//low[]以3作当前位置进行更新

visited[3]=1;

pos=3;

low[1]=0; //已标记,不更新

low[2]=map[1][2]=4; //比5小,不更新

low[3]=2; //已标记,不更新

low[4]=map[1][4]=3; //比1大,更新后为:low[4]=map[3][4]=1;

low[5]=map[1][5]=MaxInt;//无法直达,不更新

low[6]=map[1][6]=MaxInt;//比2大,更新后为:low[6]=map[1][6]=2;

最后就为:

代码实现

//
//  mai
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值