构建最小生成树的prim算法

Prim算法通过不断地增加生成树的顶点来得到最小生成树。在算法的任一时刻,一部分顶点已经添加到生成树的顶点集合中,而其余的顶点尚未加到生成树中。此时,Prim算法通过选择边(u,v),使得(u,v)的权值是所有u在生成树中但v不在生成树中的边的权值的最小者,从而找到新的顶点v并把它添加到生成树中,最后得到生成树的所有EDGE。



下面是代码

template <class EdgeType>
Edge<EdgeType> * Prim(Graph<EdgeType>& G, int s)//Prim法建立最小生成树
{
	int i, j;
	Edge<EdgeType> *MST;//存储最小生成树的边
	EdgeType *minWeight;//表示每个节点到生成树节点中的最小权值
	int *neighbor;//表示每个未进入生成树的节点,对应生成树中的最小权值节点的编号   -1表示已经在生成树节点集中
	int n = G.vertexNum;
	minWeight = new EdgeType[n];
	neighbor = new int[n];
	MST = new Edge<EdgeType>[n - 1];
	for (i = 0; i < n; i++)
	{
		minWeight[i] = AFFINITY;
		neighbor[i] = s;
	
	}
	neighbor[s] = -1;
	Edge<EdgeType> e;
	for (e = G.FirstEdge(s); G.IsEdge(e); e = G.NextEdge(e))
	{
		minWeight[e.end] = e.weight;
	}
	for (i = 0; i < n - 1; i++)
	{

		EdgeType min = AFFINITY;
		int v = -1;//标记下一个要进入生成树的节点编号
		for (j = 0; j < n; j++)
		{
			if (minWeight[j]<min&&neighbor[j]>-1)//找到目前最小权值的未进入生成树的节点的条件
			{
				min = minWeight[j];
				v = j;
			}
		}
		if (v > 0)//进行将最小权值的节点加入到生成树中并且向MST添加新的边,还有更新两个数组的信息
		{
			Edge<EdgeType> temp(neighbor[v], v, min);
			MST[i] = temp;
			neighbor[v] = -1;

			for (e = G.FirstEdge(v); G.IsEdge(e); e = G.NextEdge(e))
			{
				if (neighbor[e.end] != -1 && minWeight[e.end] > e.weight)
				{
					neighbor[e.end] = v;
					minWeight[e.end] = e.weight;
				}
			}
		}
	}
	delete[] minWeight;
	delete[] neighbor;
	return MST;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值