求最小生成树-Prim(普里姆算法)

普里姆算法时间复杂度为O(V^2),适用于稠密图

#include <iostream>
using namespace std;
#define Maxsize 100
typedef char VertexType;
typedef int EdgeType;
typedef struct{
	VertexType Vex[Maxsize];
	EdgeType edge[Maxsize][Maxsize];
	int vexnum,arcnum;
}MGraph;

//Prim-普里姆算法
void Prim(MGraph G,int v0,int &sum){
	int lowcost[Maxsize],vset[Maxsize],v;
	int i,j,k,min;
	v=v0;
	for(i=0;i<G.vexnum;i++){
		lowcost[i]=G.edge[v0][i];	//初始化最短边 
		vset[i]=0;	//初始化树集合 
	} 
	vset[v0]=1;	//将v0并入树中 
	sum=0;	//树权值初始化 
	for(i=1;i<G.vexnum;i++){
		min=INF;	//INF是已经定义的比图中所有权值都大的常量
		for(j=0;j<G.vexnum;j++)
			if(vset[j]==0&&lowcost[j]<min){
				//选出当前生成树到其余顶点
				min=lowcost[j];
				k=j;	//记录树到其余顶点最短边对应点 
			} 
		vset[k]=1;	//加入树集合
		v=k;
		sum+=min;
		for(j=0;j<G.vexnum;j++)
			if(vset[j]==0&&G.edge[v][j]<lowcost[j])
				lowcost[j]=G.edge[v][j];	//更新最短边 
	}
}

猜你喜欢

转载自blog.csdn.net/KK_2018/article/details/109907266
今日推荐