图的最小生成树算法-Prim算法

知识点:

1、图的邻接矩阵表示法;

2、Prim算法实现 

// MiniCostSpanTree_Prim.cpp 
//基于图的邻接矩阵表示法
//图的最小生成树Prim算法
//逐个顶点的找出最小生成树 
#include <iostream>
using namespace std;

#define max_vertex_num 20

int vex_num;//顶点个数
char v[max_vertex_num];//存储顶点
int arcs[max_vertex_num][max_vertex_num];//存储权值

void Initialization();//图的初始化
int LocateVex(char u);//定位顶点u,返回顶点在一维数组v中的下标
void InsertVex(char s);//插入顶点
void SetWeight(int u,int v,int w);//设置权值
void SetWeight(char u,char v,int w);//设置权值




void Prim(char firstvex);//Prim算法

int main(int argc, char* argv[])
{
	Initialization();//图的初始化
	//下面通过插入顶点和插入边,构造图
	InsertVex('a');InsertVex('b');InsertVex('c');
	InsertVex('d');InsertVex('e');InsertVex('f');
	SetWeight('a','b',6);
	SetWeight('a','c',5);
	SetWeight('a','d',5);
	SetWeight('b','c',5);
	SetWeight('b','e',3);
	SetWeight('c','d',5);
	SetWeight('c','e',6);
	SetWeight('c','f',4);
	SetWeight('d','f',2);
	SetWeight('e','f',6);

	//调用Prim算法,生成最小生成树
	::Prim('a');

	return 0;
}
void Initialization()
{//图的初始化
	vex_num=0;//开始时,顶点个数为0
	for(int i=1;i<max_vertex_num;i++)
		for(int j=i;j<max_vertex_num;j++)
			arcs[i][j]=arcs[j][i]=99999;//表示无穷大
}

void InsertVex(char s)
{//插入一个顶点(为简化,假设不重复) 
	vex_num++;
	v[vex_num]=s;//vex_num同时代表最后一个顶点在数组v中的下标
}
//
int LocateVex(char u)
{//定位顶点u对应的下标
	for(int i=1;i<=vex_num;i++)
	{	   if(v[i]==u)  return i;   }
	return 0;
}
void SetWeight(int u, int v, int w)
{//设置边上的权值
	arcs[u][v]=arcs[v][u]=w;
}
void SetWeight(char u, char v, int w)
{//设置边上的权值
	SetWeight(LocateVex(u),LocateVex(v),w);
}
void Prim(char firstvex)
{
	struct edge
	{ 
		int u;
		int v;
		int cost;
	};
    edge L[max_vertex_num];//数组L
	
	int a;//firstvex对应的下标
	a=LocateVex(firstvex);
	int i,j;
	///初始化
	for(i=1;i<=vex_num;i++)
	{
		L[i].u=i;
		L[i].v=a;
		L[i].cost=arcs[i][a];
	}
	L[a].cost=0; 
	for(i=1;i<=vex_num-1;i++)//每次选择出一条边
	{
		//选择最小的边
		int min=99999;
		int m=0;//最小值的下标
		for(int k=1;k<=vex_num;k++)
		{
			if(L[k].cost<min&&L[k].cost!=0)
			{
				min=L[k].cost;
				m=k;
			}
		}
		cout<<'('<<v[L[m].u]<<','<<v[L[m].v]<<')'<<endl; 
		L[m].cost=0;//更新L
		for(j=1;j<=vex_num;j++)
		{
			if(L[j].cost>arcs[j][m])
			{
				L[j].v=m; 	
				L[j].cost=arcs[j][m];	
			}
		}
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值