图的最小生成树:Prim算法实现

图的最小生成树,就是基于图,假设其有n的顶点,那么就要构建一颗连通树,使其各边权重和最小。最小生成树的实现算法主要有两种:Prim算法和Kruskal算法。本文着重介绍Prim算法及其实现,其中图的实现以及相关操作,采用前面博文C++
图的实现
中的实现方式,由于本文重点在于Prim算法的实现,所有就不在图的构建以及相关操作中过多赘述。

首先来看Prim算法,维基的解释其实已经很详细了,算法思想很好理解,不多说明,直接看实现。


/*
*无向图查找最小树:Prim算法
*不断找已知顶点邻接边中的最小值,在不形成环的前提下,加入边
*----- By F8Master
*/

#include "Graphmtx.h"
#include<iostream>
#include<vector>
using namespace std;

struct EdgeByInt
{
int v1,v2;
EdgeByInt(){};
EdgeByInt (int v11,int v22){
v1 = v11;
v2 = v22;
}
};

template<class T ,class E>
void Prim(Graphmtx<T,E> &G,vector<EdgeByInt> &v)//参数分别为图G,存储最小树的边的vector v
{
int numV = G.NumberOfVertices();//顶点数
int *setV = new int[numV];//表明所在集合的
for(int i = 0;i<numV;i++)//setV初始化为本身,当已经访问过之后,会更改其值为-1
setV[i] = i;
v.clear();
vector<int> vvertex(numV);//存已分配好了的点
vvertex.push_back(0);
setV[0] = -1;//凡是分配好的点均被设置为-1,以示区别

int j = 0;//找到的边的数目
while( j < numV - 1)
{
E min = INF;
int left = -1;
int right = -1;
for(int n = 0;n<vvertex.size();n++)//找到已知集里面点的邻接最近点
{
for (int m = 0;m<numV;m++)
{
if(m!=n && setV[m] != -1 &&G.getWeight(vvertex[n],m)<min )
{
min = G.getWeight(vvertex[n],m);
left = vvertex[n];
right = m;
}
}
}
setV[right] = -1;
vvertex.push_back(right);
EdgeByInt temp(left,right);
v.push_back(temp);
j++;
}
}

template <class T ,class E>
void printMinTree(Graphmtx<T,E> & G,vector<EdgeByInt> &v)
{
int size = v.size();
EdgeByInt temp;
int left,right;
for(int i = 0;i<size;i++)
{
temp = v[i];
left = v[i].v1;
right = v[i].v2;
cout<<"("<<G.getValue(left)<<" , "<<G.getValue(right)<<")"<<endl;
}
};
//测试程序
void test_Prim()
{
Graphmtx<char,int> G ;
G.inputGraph();
vector<EdgeByInt> v(G.NumberOfEdges()-1);
Prim(G,v);
printMinTree(G,v);
}

简单的测试程序:

  • 对于下图,执行程序得到结果:

  • 对于下图,执行测试:

时间: 2024-08-04 11:50:21

图的最小生成树:Prim算法实现的相关文章

图的最小生成树prim算法模板

用prim算法构建最小生成树适合顶点数据较少而边较多的图 prim算法生成连通图的最小生成胡模板伪代码: G为图,一般为全局变量,数组d为顶点与集合s的最短距离 Prim(G, d[]){ 初始化; for (循环n次){ u = 使d[u]最小的还未访问的顶点的标号; 记u 已被访问; for(从u出发到达的所有顶点v){ if (v未被访问&&以u为中介点使得v与集合S的嘴短距离d[v]更优){ 将G[u][v]赋值给v与结合S的最短距离d[v]; } } } } 邻接矩阵版: 1 /

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

Prim算法 Prim算法求最小生成树是采取蓝白点的思想,白点代表已经加入最小生成树的点,蓝点表示未加入最小生成树的点. 进行n次循环,每次循环把一个蓝点变为白点,该蓝点应该是与白点相连的最小边权的是当前蓝点中最小的.这样就相当于向生成树中添加了n-1次最小的边,最后得到的一定是最小生成树. 1 #include<cstdio> 2 #include<cstring> 3 #define N 42000 4 using namespace std; 5 int next[N],to

最小生成树--prim算法

一个无向图G的最小生成树就是由该图的那些连接G的所有顶点的边构成的树,且其总价值最低,因此,最小生成树存在的充分必要条件为图G是连通的,简单点说如下: 1.树的定义:有n个顶点和n-1条边,没有回路的称为树 生成树的定义:生成树就是包含全部顶点,n-1(n为顶点数)条边都在图里就是生成树 最小:指的是这些边加起来的权重之和最小 2.判定条件:向生成树中任加一条边都一定构成回路 充分必要条件:最小生成树存在那么图一定是连通的,反过来,图是连通的则最小生成树一定存在 上图的红色的边加上顶点就是原图的

hdu 3371 最小生成树prim算法

Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8992    Accepted Submission(s): 2519 Problem Description In 2100, since the sea level rise, most of the cities disappear. Thoug

poj1789Truck History(最小生成树prim算法)

题目链接: 啊哈哈,点我点我 思路:根据字符串中不同的长度建图,然后求图的最小生成树.. 题目: Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18272   Accepted: 7070 Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks are used for vege

数据结构:最小生成树--Prim算法

最小生成树:Prim算法 最小生成树 给定一无向带权图,顶点数是n,要使图连通只需n-1条边,若这n-1条边的权值和最小,则称有这n个顶点和n-1条边构成了图的最小生成树(minimum-cost spanning tree). Prim算法 Prim算法是解决最小生成树的常用算法.它采取贪心策略,从指定的顶点开始寻找最小权值的邻接点.图G=<V,E>,初始时S={V0},把与V0相邻接,且边的权值最小的顶点加入到S.不断地把S中的顶点与V-S中顶点的最小权值边加入,直到所有顶点都已加入到S中

E - Agri-Net (最小生成树) -- prim算法

http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=193#problem/E prim算法 思想和步骤总结 (自己所写) dis[],map[][],vis[],pos ,min,ans(主要定义的变量) 首先,prim算法用于计算图边径长度已知的图,它所求的是将图中所有顶点相连接,所需要的最短路径的长度,prim算法适合计算稠密图,它的主要思想是贪心思想,贪心准则为每次选择未加入树中且距离树最小的顶点,并用dis[]数组不断更

Highways POJ-1751 最小生成树 Prim算法

Highways POJ-1751 最小生成树 Prim算法 题意 有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输出需要添加边的两端点编号即可. 解题思路 这个可以使用最短路里面的Prim算法来实现,对于已经连接的城市,处理方式是令这两个城市之间的距离等于0即可. prim算法可以实现我们具体的路径输出,Kruskal算法暂时还不大会. 代码实现 #include<cstdio> #include<cs

POJ1258最小生成树(prim算法)

POJ1258 思路:首先把第一个结点加入树中,每次往树中加入一个结点,加入的结点必须是与当前树中的结点距离最小那个点,这样每次把结点加入树中选取的都是最小权值,循环n-1次后把所有结点都加入树中. #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 1e9; //创建map二维数组储存图表,low数组记录每2个点间最小权值,vis数组标记

最小生成树のprim算法

Problem A Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 31   Accepted Submission(s) : 10 Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公