通信网络的最小生成树配置,它是使右侧的生成树值并最小化。经常使用Prim和Kruskal算法。看Prim算法:以防万一N={V,{E}}它是在通信网络,TE它是N设置边的最小生成树。从算法U={u0}(uo属于V)。TE={}开始,复运行下述操作:在全部u属于U。v属于V-U的边(u,v)属于E中找到代价最小的一条边(u0,v0)并入集合TE,同一时候v0并入U,直至U=V为止。此时TE中必有n-1条边,T={V,{TE}}为N的最小生成树。

为实现此算法,需另设一个辅助数组closedge,以记录从U到V-U中具有最小权值的边。每次有新的顶点并入U,就要更新一次closedge。

详细代码例如以下:

#include <iostream>
#include <queue>
#include <limits.h>
#include "../Header.h"
using namespace std;
//普里姆算法构造最小生成树 const int MAX_VERTEX_NUM=20; //最大顶点数
typedef enum {DG,DN,UDG,UDN} GraphKind ;//(有向图。有向网。无向图,无向网)
typedef int VRType;
typedef char InfoType;
typedef char VertexType;
#define INFINITY INT_MAX typedef struct ArcCell{
VRType adj; //VRType是顶点关系类型,对于无权图。用1或者0表示顶点相邻与否。对于有权图。则为权值类型
InfoType info;//该弧相关信息指针
ArcCell(){
adj=0;
info=0;
}
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct MGraph{
VertexType vexs[MAX_VERTEX_NUM]; //顶点向量
AdjMatrix arcs; //邻接矩阵
int vexnum,arcnum; //图当前的顶点数和弧数
GraphKind kind; //图的种类标志
}MGraph; //记录从顶点集U到V-U的代价最小的边的辅助数组定义
typedef struct minedge{
VertexType adjvex;
VRType lowcost;
}minedge,Closedge[MAX_VERTEX_NUM]; int minimum(MGraph G,Closedge closedge){
int min=1;
for(int i=1;i<G.vexnum;++i){
if(closedge[i].lowcost!=0){
min=i;
break;
}
}
for(int i=min+1;i<G.vexnum;++i){
if(closedge[i].lowcost<closedge[min].lowcost&&closedge[i].lowcost>0)
min=i;
}
return min;
} int LocateVex(MGraph G,VertexType v1){
for(int i=0;i<MAX_VERTEX_NUM;++i){
if(G.vexs[i]==v1)
return i;
}
return MAX_VERTEX_NUM+1;
} Status CreateUDN(MGraph &G){//採用数组(邻接矩阵)表示法。构建无向网
G.kind=UDN; //手动赋值为无向网
int vexnumber=0,arcnumber=0;
char info;
cout<<"please input the vexnumber arcnumber and info:";
cin>>vexnumber>>arcnumber>>info;
G.vexnum=vexnumber;
G.arcnum=arcnumber;
for(int i=0;i<G.vexnum;++i){ //构造顶点向量
cout<<"please input the vertex of number "<<i<<"(type char) ";
cin>>G.vexs[i];
}
for(int i=0;i<G.vexnum;++i) //初始化邻接矩阵
for(int j=0;j<G.vexnum;++j){
G.arcs[i][j].adj=INFINITY;
G.arcs[i][j].info=0;
}
char v1,v2;
int weight=0,i=0,j=0;
char infomation;
for(int k=0;k<G.arcnum;++k){ //初始化邻接矩阵
cout<<"please input the two vertexs of the arc and it's weight "<<k+1<<" ";
cin>>v1>>v2>>weight;
i=LocateVex(G,v1); j=LocateVex(G,v2);
G.arcs[i][j].adj=weight;
G.arcs[j][i].adj=weight;
if(info!=48){//0的ascii码为48
cout<<"please input infomation: ";
cin>>infomation;
G.arcs[i][j].info=infomation;
G.arcs[j][i].info=infomation;
}
}
return OK;
} void DisMGraph(MGraph m){
for(int i=0;i<m.vexnum;++i){
for(int j=0;j<m.vexnum;++j){
cout<<m.arcs[i][j].adj<<" ";
}
cout<<endl;
}
} //普里姆算法
void MiniSpanTree_Prim(MGraph G,VertexType u){
int p=LocateVex(G,u);
Closedge closedge;
for(int j=0;j<G.vexnum;++j){ //辅助数组初始化
if(j!=p)
closedge[j].adjvex=u;
closedge[j].lowcost=G.arcs[p][j].adj;
}
closedge[p].lowcost=0;
closedge[p].adjvex=u;
int k=0;
for(int i=1;i<G.vexnum;++i){
k=minimum(G,closedge);
cout<<closedge[k].adjvex<<"--"<<G.vexs[k]<<endl;
closedge[k].lowcost=0;
for(int j=0;j<G.vexnum;++j){ //更新closedge数组
if(G.arcs[k][j].adj<closedge[j].lowcost&&G.arcs[k][j].adj!=0){
closedge[j].adjvex=G.vexs[k];
closedge[j].lowcost=G.arcs[k][j].adj;
}
}
}
} int main()
{
MGraph m;
CreateUDN(m);
DisMGraph(m);
MiniSpanTree_Prim(m,'a');
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

数据结构--画画--最小生成树(Prim算法)的更多相关文章

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

    最小生成树:Prim算法 最小生成树 给定一无向带权图.顶点数是n,要使图连通仅仅需n-1条边.若这n-1条边的权值和最小,则称有这n个顶点和n-1条边构成了图的最小生成树(minimum-cost ...

  2. 数据结构之最小生成树Prim算法

    普里姆算法介绍 普里姆(Prim)算法,是用来求加权连通图的最小生成树算法 基本思想:对于图G而言,V是所有顶点的集合:现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G的最 ...

  3. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  4. 最小生成树Prim算法(邻接矩阵和邻接表)

    最小生成树,普利姆算法. 简述算法: 先初始化一棵只有一个顶点的树,以这一顶点开始,找到它的最小权值,将这条边上的令一个顶点添加到树中 再从这棵树中的所有顶点中找到一个最小权值(而且权值的另一顶点不属 ...

  5. 最小生成树—prim算法

    最小生成树prim算法实现 所谓生成树,就是n个点之间连成n-1条边的图形.而最小生成树,就是权值(两点间直线的值)之和的最小值. 首先,要用二维数组记录点和权值.如上图所示无向图: int map[ ...

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

    Highways POJ-1751 最小生成树 Prim算法 题意 有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输 ...

  7. SWUST OJ 1075 求最小生成树(Prim算法)

    求最小生成树(Prim算法) 我对提示代码做了简要分析,提示代码大致写了以下几个内容 给了几个基础的工具,邻接表记录图的一个的结构体,记录Prim算法中最近的边的结构体,记录目标边的结构体(始末点,值 ...

  8. 图论算法(五)最小生成树Prim算法

    最小生成树\(Prim\)算法 我们通常求最小生成树有两种常见的算法--\(Prim\)和\(Kruskal\)算法,今天先总结最小生成树概念和比较简单的\(Prim\)算法 Part 1:最小生成树 ...

  9. 最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析

    最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析 最小生成树,老生常谈了,生活中也总会有各种各样的问题,在这里,我来带你一起分析一下这个算法的思路与实现的方式吧~~ 在考研中呢 ...

随机推荐

  1. Swift编程语言学习1.3——类型安全和投机型

    Swift 是类型安全(type safe )语言.类型安全的语言可以让你清楚地知道代码被处理值类型.假设你需要一个代码String.你绝对不能进去一个不小心传球Int. 因为 Swift 它是类型安 ...

  2. cocos2d-x3.0 windows 环境配置

    cocos2d-x3.0 windows 环境配置 参考Oo泡泡糖oO的CSDN博文 :http://blog.csdn.net/u010296979/article/details/24273393 ...

  3. NSIS:应用软件自动升级功能的探索与实践

    原文 NSIS:应用软件自动升级功能的探索与实践 记得以前轻狂曾分享过使用第三方软件实现应用软件自动升级功能 (详细http://www.flighty.cn/html/soft/20110106_1 ...

  4. 【翻译】在Ext JS 5应用程序中怎样使用路由

    原文:How to Use Routing in Your Ext JS 5 Apps 简单介绍 Ext JS 5是一个重要的公布版本号,它提供了很多新特性来创建丰富的.企业级的Web应用程序.MVV ...

  5. Rabbitmq 加入用户訪控制台(guest无法登陆控制台问题)

    对于rabbitmq的guest用户无法訪问控制台的问题,是由于rabbitmq做了安全措施,禁止guest登陆控制台.须要我们自己创建用户进行登陆 1,运行加入用户命令 rabbitmqctl ad ...

  6. ASP.NET MVC应用程序展示RDLC报表

    原文:ASP.NET MVC应用程序展示RDLC报表 学习ASP.NET MVC这样久,在学习,练习与应用过程中,觉得很多知识与以前的ASP.NET多有区别,但是实现操作起来,细处又有许多相近的地方. ...

  7. HDU 4123 Bob’s Race 树的直径+单调队列

    题意: 给定n个点的带边权树Q个询问. 以下n-1行给出树 以下Q行每行一个数字表示询问. 首先求出dp[N] :dp[i]表示i点距离树上最远点的距离 询问u, 表示求出 dp 数组中最长的连续序列 ...

  8. Javascript学习1 - Javascript中的类型对象

    原文:Javascript学习1 - Javascript中的类型对象 1.1关于Numbers对象. 常用的方法:number.toString() 不用具体介绍,把数字转换为字符串,相应的还有一个 ...

  9. SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器

    原文:SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器 上期回顾: SSIS从理论到实战,再到应用(2)----SSIS包的控制流   首先我们来看看包里面的变量 SSIS ...

  10. BNUOJ 34981 A Matrix

    BNUOJ 34981 A Matrix 题目地址:pid=34981" style="color:rgb(0,136,204); text-decoration:none&quo ...