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

#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）求最小生成树

• Hackbuteer1
• 2011年06月22日 16:06
• 3876

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

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

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

• liujan511536
• 2014年12月23日 13:45
• 896

## 普里姆算法（Prim算法求最小生成树）

• xinlingchengbao
• 2016年08月05日 18:59
• 1068

## 最小生成树,普里姆算法（Python实现）

• 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
• 2016年06月04日 22:05
• 568

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

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

## 邻接表实现prim

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

## 最小生成树之Prim（普里姆）算法

• u012965373
• 2015年08月11日 15:18
• 1342

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

1. 邻接矩阵存储//图的邻接矩阵存储表示 #define INFINITY INT_MAX #define MAX_VERTEX_NUM 20 typedef enum {DG, DN, UD...
• hustspy1990
• 2010年11月29日 19:43
• 2402

举报原因： 您举报文章：图的最小生成树之普里姆Prim算法 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)