Prim算法

算法分类:

贪心


算法原理:

1. 在图G=(V, E) (V表示顶点 ,E表示边)中,从集合V中任取一个顶点(例如取顶点v0)放入集合 U中,这时 U={v0},集合T(E)为空。
2. 从v0出发寻找与U中顶点相邻(另一顶点在V中)权值最小的边的另一顶点v1,并使v1加入U。即U={v0,v1 },同时将该边加入集合T(E)中。
3. 重复2,直到U=V为止。
这时T(E)中有n-1条边,T = (U, T(E))就是一棵最小生成树。


算法时空复杂度:

O(n平方)


代码实现:

#define MAX 2147483647
#define ARRAYSIZE ?


int  dist[ARRAYSIZE];
int  G[ARRAYSIZE][ARRAYSIZE];
bool vis[ARRAYSIZE];
int  path[ARRAYSIZE];	// 记录最小生成树的连接情况


int prim(int src, int n)
{
	int i, v, w, min;
	
	/* 记录最小生成树总长度 */
	int length = 0;
	
	memset(vis, false, sizeof(vis));
	
	/* 各点距离初始化 */
	for (i = 1; i <= n; ++i) {
		dist[i] = G[src][i];
		path[i] = src;
	}
		
	dist[src] = 0;
	vis[src] = true;
	
	for (i = 1; i < n; ++i)
	{
		min = MAX;
		
		for (w = 1; w <= n; ++w)
			if (!vis[w] && min > dist[w])
			{
				v = w;
				min = dist[w];	
			}	
		
		/* 将找到的最近点加入最小生成树 */
		vis[v] = true;
		length += min;
		
		for (w = 1; w <= n; ++w)
		{
			/* 修正其他点到最小生成树的距离 */
			if (!vis[w] && G[v][w] < dist[w]) {
				dist[w] = G[v][w];	
				path[i] = v;
			}
		}
	}	
	
	return length;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值