图的最小生成树之普里姆Prim算法

原创 2015年08月15日 15:57:07

源代码如下:


#include<iostream>
using namespace std;
#define MAX_VERTEX_NUM 20
#define infinity 9
typedef int QElemType; 
typedef int EdgeData;
typedef char VertexData;
typedef struct 
{
    VertexData verlist[MAX_VERTEX_NUM];            //顶点表
     EdgeData edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵--可试为边之间的关系 
     int vexnum,edgenum;                          //顶点数和边数
}MTGraph;


void printMTGragh(MTGraph *G){
	int i,j;
	for (i = 1 ; i <= G->vexnum ; i++){
		for (j = 1 ; j <= G->vexnum ; j++)
			cout<<G->edge[i][j]<<" ";
		cout<<endl;
	}
//	Prim(G,G->edge);
}

void Prim(MTGraph *G){             //集合V-U的顶点尚未加入最小生成树中,集合U则已加入 
	int lowcost[MAX_VERTEX_NUM+1]; //用来保存集合V-U中各顶点与集合U中顶点最短边的权值,
								   // lowcost[v] = infinity 表示顶点V已加入了最小生成树中 
								   
	int closest[MAX_VERTEX_NUM+1]; //用来保存依附于该边的在集合U的顶点
									// 该边:集合V-U中各顶点与集合U中顶点最短边
	int i,j,k,h,min;
//	printMTGragh(G);
	for(i = 2;i<=G->vexnum;i++){
		lowcost[i] = G->edge[1][i];
		closest[i] = 1;  //将定点1加入集合U中 
	}
	for(i = 2;i<=G->vexnum;i++){
		min = 9 ;
		k = i;
		for(j=2;j<=G->vexnum;j++)
			if(lowcost[j] < min && lowcost[j]!=0){
				min = lowcost[j]; //在 lowcost中取最小边 
				k = j;
			}
		cout<<"将第"<<i<<"个元素放入集合U中时,Lowcost原序列:";
		for(h = 2;h<=G->vexnum;h++)
			cout<<lowcost[h]<<" ";
		cout<<endl;
		cout<<"("<<k<<","<<closest[k]<<")"<<endl; //输出顶点K与之对应的权值 
		cout<<"取出的顶点为:"<<k<<"将顶点"<<k<<"与顶点"<<closest[k]<<"相连"<<endl; 
		lowcost[k] = 0;  //将顶点K置于集合U中 
		
		for(j=2;j<=G->vexnum;j++) //调整数组lowcost和 cloest
			if(G->edge[k][j]<lowcost[j]){
				lowcost[j] = G->edge[k][j];
				closest[j] = k;
			}
		cout<<"将第"<<i<<"个元素放入集合U中时,Lowcost更新后的序列:";
		for(h = 2;h<=G->vexnum;h++)
			cout<<lowcost[h]<<" ";
		cout<<endl;
	}
}  //时间复杂度O(n^2) 
//建立图的邻接矩阵 
void createMTGraph(MTGraph *G){ 
	int i,j,k,w;
	cout<<"输入顶点数和边数如(5 7)"<<endl;
	cin>>G->vexnum>>G->edgenum;
	cout<<"输入顶点信息,如(A B C D...)"<<endl;
	for(i = 0 ; i<G->vexnum;i++)
		cin>>G->verlist[i];
	for(i = 0 ; i<=G->vexnum;i++)
		for(j = 0 ; j<=G->vexnum;j++)
			G->edge[i][j] = infinity;
			
	cout<<"输入边(i,j)上的权值w,如(i j w)"<<endl;
	 for(k=0;k<G->edgenum;k++){
	 	cin>>i>>j>>w;
	 	G->edge[i][j] = w;
	 	G->edge[j][i] = w;
	 }
}

main(){
	MTGraph *G ;
	G = new MTGraph();
	createMTGraph(G);
	printMTGragh(G);
	Prim(G);
	system("pause");
}



程序运行后的结果





版权声明:本文为博主原创文章,未经博主允许不得转载。

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

一、普里姆(Prim)算法  1.基本思想:设G=(V, E)是具有n个顶点的连通网,T=(U, TE)是G的最小生成树, T的初始状态为U={u0}(u0∈V),TE={},重复执行下述操作:在所有...
  • Hackbuteer1
  • Hackbuteer1
  • 2011年06月22日 16:06
  • 3876

用普里姆算法求最小生成树

/*用普里姆算法求最小生成树*/ #include using namespace std; /*邻接矩阵的类型定义*/ #define MAX 10000000 #define MAX_...
  • hackerain
  • hackerain
  • 2010年11月28日 17:34
  • 4865

普里姆算法求最小生成树

最小生成树
  • liujan511536
  • liujan511536
  • 2014年12月23日 13:45
  • 896

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

普里姆算法的基本思想:普里姆算法是一种构造最小生成树的算法,它是按逐个将顶点连通的方式来构造最小生成树的。时间复杂度为O(n^2)。 从连通网络N = { V, E }中的某一顶点u0出发,选择与它...
  • xinlingchengbao
  • xinlingchengbao
  • 2016年08月05日 18:59
  • 1068

最小生成树,普里姆算法(Python实现)

普里姆算法的基本思想:普里姆算法是另一种构造最小生成树的算法,它是按逐个将顶点连通的方式来构造最小生成树的。...
  • HeiSeDiWei
  • HeiSeDiWei
  • 2015年12月16日 13:46
  • 4226

java 普里姆(Prim)算法求图的最小生成树

1. 基本思想: 设G=(V,E)是连通网,T=(U,D)是最小生成树,V,U是顶点集合,E,D是边的集合 ①若从顶点u开始构造最小生成树,则从集合V中取出顶点u放入集合U中,标记顶点v的visi...
  • yxmmao
  • yxmmao
  • 2016年06月04日 22:05
  • 568

最小生成树(MST)----普里姆(Prim)算法与克鲁斯卡尔(Kruskal)算法

1、概念:给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树. 2、应用:例如:要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信...
  • mapeng892020
  • mapeng892020
  • 2015年03月10日 10:49
  • 808

邻接表实现prim

///*******linjiebiao************************* #include #include #include using namespace std; const...
  • b2utyyomi
  • b2utyyomi
  • 2016年11月16日 20:44
  • 284

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

最小生成树之Prim(普里姆)算法
  • u012965373
  • u012965373
  • 2015年08月11日 15:18
  • 1342

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

1. 邻接矩阵存储//图的邻接矩阵存储表示 #define INFINITY INT_MAX #define MAX_VERTEX_NUM 20 typedef enum {DG, DN, UD...
  • hustspy1990
  • hustspy1990
  • 2010年11月29日 19:43
  • 2402
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图的最小生成树之普里姆Prim算法
举报原因:
原因补充:

(最多只允许输入30个字)