最小生成树Prim算法实现

/************************ 
*
*	Author:Wang Yong
*	Blog:http://www.cnblogs.com/newwy
*
************************/
#include <iostream>
using namespace std;
#define MAXN 10000
#define INF  10000000

//无向图最小生成树,prim算法,邻接阵形式,复杂度O(n^2)
//返回最小生成树的长度,传入图的大小n和邻接阵mat,不相邻点边权inf
//可更改边权的类型,pre[]返回树的构造,用父结点表示,根节点(第一个)pre值为-1
//必须保证图的连通的!

void Prim(int n,int Graph[][MAXN],int * pre)
{
	int vset[MAXN],lowcost[MAXN];//lowcost[MAXN]表示存放顶点到为完成的生成树的最小权值
								//v[MAXN]表示该结点是否已经在生成树里 
	int i,j,k;				
	for(i = 0 ; i < n; i++)		//赋初始值,将每个结点的连接到生成树的权值赋值为最大,所有结点均未在生成树中
								//所有结点的前驱都是-1,表示没有任何结点与之相连 
	{lowcost[i] = INF;vset[i] = 0;pre[i] = -1;}
	
	for(lowcost[j = 0] = 0;j < n; j++)//分别将连通图中n个结点,加入到最小生成树中
	{
		for(k = -1,i = 0; i < n; i++)//第一次循环将k 赋值 -1,这样找到第一个没有加入到生成树中的结点,之后k值改变
		{							//继续循环,寻找不在生成树中的结点到生成树的权值最小的那个结点,将其链接到生成树上
			if(vset[i] == 0 &&(k == -1 || lowcost[i] < lowcost[k]))
				k = i;
		}
		printf("edge(%d,%d)的权值为%d,被加入生成树中\n",pre[k]+1,k+1,lowcost[k]);
		vset[k] = 1;				//将选中的结点做好标记 
		
		for(i = 0 ; i < n; i++)		//修正候选边,每次记录入选的结点k之后。分别记录其他结点到生成树的最小权值
		{
			if(vset[i] == 0 && Graph[k][i] < lowcost[i])
			{

				lowcost[i] = Graph[k][i];	
				pre[i] = k;				//pre记录i结点到生成树最小权值是连接在k结点上
			}
		} 
	} 
}
int mat[MAXN][MAXN],pre[MAXN];
int main()
{
	memset(mat,INF,sizeof(mat));
	int n;
	printf("请输入结点数目:");
	scanf("%d",&n);
	int i,j;
	printf("输入边的数目:");
	int en;
	scanf("%d",&en); 
	int a,b,cost;
	for(i = 0 ; i < en ;i++)
	{
		scanf("%d %d %d",&a,&b,&cost);
		--a;--b;
		mat[a][b] = mat[b][a] = cost;		
	}
	for(i = 0; i < n; i++)
	{
		for(j = 0 ; j < n ; j++)
			printf("%d ",mat[i][j]);
		printf("\n");
	}
	Prim(n,mat,pre);
	
} 

转载于:https://www.cnblogs.com/newwy/archive/2010/10/31/1865577.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值