Prim算法(最小生成树) 我TM只能先做到这儿了 后面继续补充

http://wenku.baidu.com/view/b7e730c751e2524de518964bcf84b9d529ea2c46

文库里面有更具体的解释

实在不行 这个视频解释的也很详细

http://v.youku.com/v_show/id_XNjg1MDk5ODM2.html?f=21855299&o=1

//邻接矩阵的广度遍历算法

void MiniSpanTree_Prim(MGraph G)
{
	int min, i, j, k;
	int adjvex[MAXVEX]; // 保存相关顶点下标[0,0,1,0,0,0,1,0,1] 这个值表示什么呢?表示0和0之间的连线,1:表示2和1之间有联系,接下来1代表顶点元素6和1之间有联系。 1:8和1有联系;因为是从1出发的顶点看看各点和1的联系。
	int lowcost[MAXVEX]; //存放相关顶点间边的权值。通过好多层迭代把每一行最短的值给筛选出来。生成最小生成树,得到都是边和边权值最小的连线。唯一的要求就是把所有的顶点都给连起来。

	
	lowcost[0]=0;  //v0作为最小生成树的根开始遍历,权值为0
	adjvex[0] = 0; //v0第一个加入

	//初始化操作
	for(i=1; i<G.numVerteses; i++)
	{
		lowcost[i] = G.arc[0][i]; //将邻接矩阵第0行的所有权值先加入数组。
		adjvex[i]=0;              //初始化全部先为v0的下标。
	}

	//真正构造最小生成树的过程   分为两个过程: 1.循环所有结点找出lowcost数组已存储的最小权值
	for(i=1; i<G.numVertexes;i++)
	{
		min = INFINITY;  //初始化最小权值为65535等不可数值;
		j = 1; 

		k = 0;
		//退出循环直到从1--8里面找到真正的min。 这是给一个固定的顶点找到一个最小的值
		while(j<G.numVerteses) //j从1开始 遍历1--8;因为下标是0--8,而0的话前面已经给初始化了。是第一个顶点已经无偿作为最小生成数的根结点。
		{  
			//找出lowcost数组已存储的最小权值
			if(lowcost[j]!=0 && lowcost[j]<min) //lowcost[j]!=0:自己和自己连线没意思。如果lowcost[j]<min的话,说明是有连线的。
			{
				min = lowcost[j];  //再从Lowcost中找到除自己外以及已经上次找到的最小距离的 中的 最小的权。 
				k = j//将发现的最小权值的下标存入k,以待使用;
			}
			j++;
		} 
	
		//打印当前顶点边中权值最小的边;
		printf("{%d,%d}=",adjvex[k],k); //adjvex 存放的是 上一个找到的顶点下边的值。    第一次循环打印的结果是,adjvex[1]=0;  k==1
		lowcost[k] = 0; //将当前顶点的权值设置为0,表示此顶点已经完成任务,进行下一个顶点的遍历;第一行权值内 只要有一个点完成任务,那么就设置为0;


		//邻接矩阵k行逐个遍历全部结点;这个作用和上面不同,我们之前的lowcost初始值只有v0的这一行和vo连接点的一个权值,
		//这里从k开始了 k的值是1,对k=这一行的遍历,然后呢?修改lowcost的值,如果第j的小于第一行的lowcost的话,那么就替换掉lowcost原来的值。

		for(j=0; j<G.numVertexes;j++)
		{
			if(lowcost[j]!=0 && G.arc[k][j]<lowcost[j])  //第k行的权值小于lowcost[j] lowcost依然保持着第一行的的权值。
			{
				lowcost[j] = G.arc[k][j]; //lowcost里面所有的权值也是所替换掉的最小的权值。
				adjvex[j] = k; //将下标k的顶点填到adjvex[j]中。作为我们待会打印的上一个顶点。将每一个替换的都adjvex都给输入进去。最终输出的结果就是adjvex里面所有的点都是按照顺序的最小权值的点。
			}
		}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值