普里姆算法求最小生成树

#include "iostream"
using namespace std;

const int num = 9; //节点个数
#define Infinity 65535;
//本例中以节点0作为生成树的起始节点
void MinSpanTree_Prime(int graphic[num][num]){
	int lowcost[num]; //记录从节点num到生成树的最短距离,如果为0则表示该节点已在生成树中
	int adjvex[num]; //记录相关节点,如:adjvex[1] = 5表示最小生成树中节点1和5有路径相连
	int sum = 0; // 记录最小生成树边权重之和
	memset(adjvex, 0, sizeof(adjvex));
	//选取0节点作为生成树的起点
	for (int i = 0; i < num; i++)
		lowcost[i] = graphic[0][i];

	for (int i = 1; i < num; i++){
		int min = Infinity;
		int index;
		for (int j = 1; j < num; j++){
			if (lowcost[j] != 0 && lowcost[j] < min){
				index = j;
				min = lowcost[j];
			}
		}
		sum += min;
		lowcost[index] = 0; //将当前节点放入生成树中
		cout << adjvex[index] << " -> " << index << endl;
		//修正其他节点到生成树的最短距离
		for (int j = 1; j < num; j++){
			if (lowcost[j] != 0 && graphic[index][j] < lowcost[j]){
				lowcost[j] = graphic[index][j];
				adjvex[j] = index;
			}
		}
	}
	cout << "sum = " << sum << endl;
}

int main(){
	int graphic[num][num];
	for (int i = 0; i < num; i++)
	for (int j = 0; j < num; j++){
		if (i == j)
			graphic[i][j] = 0;
		else
			graphic[i][j] = Infinity;
	}
	graphic[0][1] = 1;
	graphic[0][2] = 5;
	graphic[1][0] = 1;
	graphic[1][2] = 3;
	graphic[1][3] = 7;
	graphic[1][4] = 5;
	graphic[2][0] = 5;
	graphic[2][1] = 3;
	graphic[2][4] = 1;
	graphic[2][5] = 7;
	graphic[3][1] = 7;
	graphic[3][4] = 2;
	graphic[3][6] = 3;
	graphic[4][1] = 5;
	graphic[4][2] = 1;
	graphic[4][3] = 2;
	graphic[4][5] = 3;
	graphic[4][6] = 6;
	graphic[4][7] = 9;
	graphic[5][2] = 7;
	graphic[5][4] = 3;
	graphic[5][7] = 5;
	graphic[6][3] = 3;
	graphic[6][4] = 6;
	graphic[6][7] = 2;
	graphic[6][8] = 7;
	graphic[7][4] = 9;
	graphic[7][5] = 5;
	graphic[7][6] = 2;
	graphic[7][8] = 4;
	graphic[8][6] = 7;
	graphic[8][7] = 4;

	MinSpanTree_Prime(graphic);

	return 0;
}

时间: 2024-11-09 00:50:34

普里姆算法求最小生成树的相关文章

图-&gt;连通性-&gt;最小生成树(普里姆算法)

文字描述 用连通网来表示n个城市及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价.对于n个定点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网.现在,我们要选择这样一个生成树,使总的耗费最少.这个问题就是构造连通网的最小代价生成树(Minimum Cost Spanning Tree: 最小生成树)的问题.一棵生成树的代价就是树上各边的代价之和. 有多种算法可以构造最小生成树,其他多数都利用的最小生成的MST(minimum

数据结构(五)图---最小生成树(普里姆算法)

一:最小生成树 (一)定义 我们把构造连通网的最小代价生成树称为最小生成树 (二)什么是最小生成树? 1.是一棵树 1)无回路 2)N个顶点,一定有N-1条边 2.是生成树 1)包含全部顶点 2)N-1条边都在图中 3.边的权重和最小 (三)案例说明 在实际生活中,我们常常碰到类似这种一类问题:如果要在n个城市之间建立通信联络网, 则连通n个城市仅仅须要n-1条线路.这时.我们须要考虑这样一个问题.怎样在最节省经费前提 下建立这个通信网.换句话说,我们须要在这n个城市中找出一个包括全部城市的连通

数据结构-最小生成树-普里姆算法

转自https://blog.csdn.net/ZGUIZ/article/details/54633115 首先仍然是预定义: 1 #define OK 1 2 #define ERROR 0 3 #define Max_Int 32767 4 #define MVNum 100 5 6 typedef int Status; 7 typedef char VerTexType; 8 typedef int ArcType; 9 10 struct{ 11 VerTexType adjvex;

普里姆算法介绍

普里姆(Prim)算法,和克鲁斯卡尔算法一样,是用来求加权连通图的最小生成树的算法. 基本思想 对于图G而言,V是所有顶点的集合:现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G的最小生成树中的边. 从所有u?U,v?(V-U) (V-U表示出去U的所有顶点)的边中选取权值最小的边(u, v),将顶点v加入集合U中,将边(u, v)加入集合T中,如此不断重复,直到U=V为止,最小生成树构造完毕,这时集合T中包含了最小生成树中的所有边. 普里姆算法图解 以上图G4为例,

普里姆算法

//普里姆算法 //构造连通网的最小代价生成树 /* 基本思路: 1. 任选一个结点,任选一个作为这棵树的起点. 2. 找出所有与当前树中叶子结点连接的边,找出权最小的一条边, 将这条边的另一个端点加入到树中. 3. 重复2的操作,直到连接所有结点. 重点: 1.lowcost数组里保存的是与“当前树中所有叶子节点”有连线的未加入树的结点 2.adjvex数组:体会函数中的“printf("(%d, %d)\n", adjvex[k], k);” */ #include <std

ACM第四站————最小生成树(普里姆算法)

对于一个带权的无向连通图,其每个生成树所有边上的权值之和可能不同,我们把所有边上权值之和最小的生成树称为图的最小生成树. 普里姆算法是以其中某一顶点为起点,逐步寻找各个顶点上最小权值的边来构建最小生成树. 其中运用到了回溯,贪心的思想. 废话少说吧,这个其实是一个模板,直接套用就好!直接上题吧!这些东西多练就好! 一.最小生成树: 题目描述 求一个连通无向图的最小生成树的代价(图边权值为正整数). 输入 第 一行是一个整数N(1<=N<=20),表示有多少个图需要计算.以下有N个图,第i图的第

数据结构之最小生成树(普里姆算法)

1)普里姆算法 可取图中任意一个顶点v作为生成树的根,之后若要往生成树上添加顶点w,则在顶点v和顶点w之间必定存在一条边,并且 该边的权值在所有连通顶点v和w之间的边中取值最小.一般情况下,假设n个顶点分成两个集合:U(包含已落在生成树上 的结点)和V-U(尚未落在生成树上的顶点),则在所有连通U中顶点和V-U中顶点的边中选取权值最小的边. 例如:起始生成树上面就一个顶点.为了连通两个集合,在可选的边中,选择权值最小的.需要辅助数组,V-U中所有顶点. 具体实例如下图所示:求下图的最小生成树 我

数据结构例程——最小生成树的普里姆算法

本文是[数据结构基础系列(7):图]中第11课时[最小生成树的普里姆算法]的例程. (程序中graph.h是图存储结构的"算法库"中的头文件,详情请单击链接-) #include <stdio.h> #include <malloc.h> #include "graph.h" void Prim(MGraph g,int v) { int lowcost[MAXV]; //顶点i是否在U中 int min; int closest[MAXV]

普里姆算法,克鲁斯卡尔算法,迪杰斯特拉算法,弗洛里德算法

做数据结构的课程设计顺便总结一下这四大算法,本人小白学生一枚, 如果总结的有什么错误,希望能够告知指正 普里姆算法如图所示prim 找出最短的边,再以这条边构成的整体去寻找与之相邻的边,直至连接所有顶点,生成最小生成树,时间复杂度为O(n2) 克鲁斯卡尔算法如图所示kruskal 克鲁斯卡尔算法,假设连通网N=(N,{E}),则令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点 自成一个连通分量.在E中选择代价最小的边,若该边依附的定顶点落在T中不同的连通分量上,