最小生成树 Prim算法实现

最小生成树 Prim算法实现

最近帮辩论队的学妹写道程序 要用到最小生成树,用Prim算法实现记录如下:

题目:

已知一个无向图的G=(V,E)的邻接矩阵W,现要求找一条经过每一个顶点的路,该路的总权最短。




实现代码如下:

<span style="font-size:14px;">/*
*图的最小生成树
*使用Prim算法实现
*2015/11/29于中国矿业大学
*/
#include<iostream>
using namespace std;
int g[6][6] = {//待查找最短路线的图的存储
	0,56,35,2,51,60,
	56,0,21,57,78,70,
	35,21,0,36,68,68,
	2,57,36,0,51,61,
	51,78,68,51,0,13
};
int visited[6];//用于标记点是否访问过
int lowcost[6];//用于记录点间最小权重
int path[6];//记录构造过程即路径
int Prim(int start)//Prim算法实现 start表示开始的点
{
	path[0] = start;//路径记录开始的点
	int pos = 0;//用于记录最小权重对应的位置
	visited[start] = 1;//从start点开始,标记1表示已访问
	int count = 0;//count表示边的个数,用于判定是否构造路径结束
	int result = 0;//用于记录最小权值和
	int j;
	for(j=0;j<6;j++)
		lowcost[j] = g[start][j];
	while(count<5)//6个点最终需要5条路径
	{
		int min = 999;
		for(j=0;j<6;j++)//查询最小权重
		{
			if(visited[j]!=1 && min>lowcost[j])
			{
				min = lowcost[j];
				pos = j;
			}
		}
		result += min;//权重相加
		visited[pos] = 1;//新加入点
		count++;//表示新加入一条边
		path[count] = pos;
		for(j=0;j<6;j++)//更新最小权重
		{
			if(visited[j]!=1 && lowcost[j]>g[pos][j])
				lowcost[j]=g[pos][j];
		}
	}
	return result;
}
int main()
{
	cout<<Prim(1)<<endl;//无论从哪个点开始结果是一样的只是构造过程的点的顺序不同但全局来看路径是相同的
	int i;
	for(i=0;i<6;i++)//根据开始的点不同,构造过程不同
		cout<<path[i]+1<<" ";
	cout<<endl;
	return 0;
}</span>


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值