普里姆(Prim)算法
/*
普里姆算法的主要思想:
利用二维数组把权值放入,然后找在当前顶点的最小权值,然后走过的路用一个数组来记录
*/
# include <stdio.h> typedef char VertexType;//定义顶点类型
typedef int EdgeType;//定义边上的权值类型
# define MAX_VERTEX //最大顶点个数
# define INFINITY //用65535代表无穷大 typedef struct
{//邻接矩阵存储结构
VertexType vexs[MAX_VERTEX];//顶点表
EdgeType arc[MAX_VERTEX][MAX_VERTEX];//邻接矩阵
int numVertexs, numEdges;//图中当前的顶点数和边数 }MGraph; void CreateMGraph(MGraph *G)
{
int i, j;
G->numEdges=;
G->numVertexs=; for (i = ; i < G->numVertexs; i++)
{
for ( j = ; j < G->numVertexs; j++)
{
if (i==j)
G->arc[i][j]=;
else
G->arc[i][j] = G->arc[j][i] = INFINITY;
}
} G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=;
G->arc[][]=; for(i = ; i < G->numVertexs; i++)
{
for(j = i; j < G->numVertexs; j++)
{
G->arc[j][i] =G->arc[i][j];
}
} } void MinSpanTree_Peim (MGraph &G)
{//普里姆算法,最小生成树
int min, i, j, k;
int add=;
int adjvex[MAX_VERTEX];
int lowcost[MAX_VERTEX];
lowcost[] = ;
adjvex[] = ; for (i=; i<G.numVertexs; i++)
{//若是从v0顶点开始查找,从顶点v0的矩阵全部赋值到lowcost数组中,adjvex数组全部为0;
lowcost[i] = G.arc[][i];//二维数组存放的权值
adjvex[i] = ;//所有都为0
} for (i=; i<G.numVertexs; i++)
{//最小生成树
min = INFINITY;//无穷大
j=;
k=; while (j < G.numVertexs)
{//查找lowcost数组中最小的值,把最小的值赋给min,且最小值的下表赋给k
if (lowcost[j]!= && lowcost[j]<min)
{
min = lowcost[j];//存放最小的权值
k = j;//把存放最小权值的顶点下标
}
j++;
}
printf ("(%d——%d)\n", adjvex[k], k);
add = add + G.arc[adjvex[k]][k];
/*因为52~56行已经把adjvex数组全部赋值为0,所以一开始打印出来的就是0,后来打印出来的就是以上一个在lowcost
数组中最小值的下表(下表对应的顶点),顶点的矩阵中比当前lowcost数组中的值还要小的值的下标,和lowcost数组中最小值的下标*/
lowcost[k] = ;
//若刚才存放最小权值的顶点是1(k=1),则下面就for循环就从发1的二位数组继续寻找最小生成树
for (j=; j<G.numVertexs; j++)
{//以在lowcost数组中最小值的下表作为二位数组的第一个下标与当前lowcos数组中的值进行比较。
//查找最小值
if (lowcost[j]!= && G.arc[k][j]<lowcost[j])//t
{
lowcost[j] = G.arc[k][j];//
adjvex[j] = k;
}
}
}
printf ("%d\n", add); return;
} int main (void)
{
MGraph G;
CreateMGraph (&G);
MinSpanTree_Peim (G); return ;
} /*
在vc++6.0运行结果:
请输入顶点数和边数:9 15
请输入第1个顶点信息:v0
请输入第2个顶点信息:v1
请输入第3个顶点信息:v2
请输入第4个顶点信息:v3
请输入第5个顶点信息:v4
请输入第6个顶点信息:v5
请输入第7个顶点信息:v6
请输入第8个顶点信息:v7
请输入第9个顶点信息:v8
请输入边(vi,vj)上的下表i,下表j和权w:0 1 10
请输入边(vi,vj)上的下表i,下表j和权w:0 5 11
请输入边(vi,vj)上的下表i,下表j和权w:1 6 16
请输入边(vi,vj)上的下表i,下表j和权w:1 2 18
请输入边(vi,vj)上的下表i,下表j和权w:1 8 12
请输入边(vi,vj)上的下表i,下表j和权w:2 8 8
请输入边(vi,vj)上的下表i,下表j和权w:2 3 22
请输入边(vi,vj)上的下表i,下表j和权w:8 3 21
请输入边(vi,vj)上的下表i,下表j和权w:6 5 17
请输入边(vi,vj)上的下表i,下表j和权w:6 3 24
请输入边(vi,vj)上的下表i,下表j和权w:6 7 19
请输入边(vi,vj)上的下表i,下表j和权w:3 4 20
请输入边(vi,vj)上的下表i,下表j和权w:3 7 16
请输入边(vi,vj)上的下表i,下表j和权w:4 7 7
请输入边(vi,vj)上的下表i,下表j和权w:4 5 26
(0——1)
(0——5)
(1——8)
(8——2)
(1——6)
(6——7)
(7——4)
(7——3)
Press any key to continue */
普里姆(Prim)算法的更多相关文章
- 普里姆Prim算法介绍
普里姆(Prim)算法,和克鲁斯卡尔算法一样,是用来求加权连通图的最小生成树的算法. 基本思想 对于图G而言,V是所有顶点的集合:现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T ...
- 图解最小生成树 - 普里姆(Prim)算法
我们在图的定义中说过,带有权值的图就是网结构.一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接 ...
- JS实现最小生成树之普里姆(Prim)算法
最小生成树: 我们把构造连通网的最小代价生成树称为最小生成树.经典的算法有两种,普利姆算法和克鲁斯卡尔算法. 普里姆算法打印最小生成树: 先选择一个点,把该顶点的边加入数组,再按照权值最小的原则选边, ...
- 图的普里姆(Prim)算法求最小生成树
关于图的最小生成树算法------普里姆算法 首先我们先初始化一张图: 设置两个数据结构来分别代表我们需要存储的数据: lowcost[i]:表示以i为终点的边的最小权值,当lowcost[i]=0说 ...
- 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...
- 最小生成树-普利姆(Prim)算法
最小生成树-普利姆(Prim)算法 最小生成树 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一种特殊的图),或者 ...
- 图论---最小生成树----普利姆(Prim)算法
普利姆(Prim)算法 1. 最小生成树(又名:最小权重生成树) 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一 ...
- 经典问题----最小生成树(prim普里姆贪心算法)
题目简述:假如有一个无向连通图,有n个顶点,有许多(带有权值即长度)边,让你用在其中选n-1条边把这n个顶点连起来,不漏掉任何一个点,然后这n-1条边的权值总和最小,就是最小生成树了,注意,不可绕成圈 ...
- 最小生成树之Prim(普里姆)算法
关于什么是Prim(普里姆算法)? 在实际生活中,我们常常碰到类似这种一类问题:如果要在n个城市之间建立通信联络网, 则连通n个城市仅仅须要n-1条线路.这时.我们须要考虑这样一个问题.怎样在最节省经 ...
随机推荐
- 【原创】QT5-卸载精灵v1.0-卸载windows软件-简易版
由于项目需求,需要实现卸载windows上的普通软件的小功能,实现起来还是比较简单的. 先发个图: 思路: 1.根据注册表的信息去打开应用程序,卸载也一样: 2.读桌面的快捷方式,根据快捷方式的指向路 ...
- mh
http://video.sina.com.cn/vlist/news/zt/mlxyhkhbsl/#131455718 http://www.cnblogs.com/xinye/archive/20 ...
- Unix主机syslog配置
将下面的内容附加到/etc/syslog.conf文件中(注意*和@之间是有空格的): *.* @ip 修改/etc/services文件中的syslog服务的端口号为上面提到的Syslog监听端口. ...
- PIMPL设计模式的理解和使用
以下两段不同程序的比较 //file a.h #include "a.h" #include “ b.h” class A{ void Fun(); B b; } //file: ...
- lastcomm搜索并显示以前执行过的命令信息
lastcomm搜索并显示以前执行过的命令信息
- hdu 1010 Tempter of the Bone 深搜+剪枝
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- OC基础4:类和方法
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.类的声明(@interface)要放在 ...
- poj 2186 (强连通缩点)
题意:有N只奶牛,奶牛有自己认为最受欢迎的奶牛.奶牛们的这种“认为”是单向可传递的,当A认为B最受欢迎(B不一定认为A最受欢迎),且B认为C最受欢迎时,A一定也认为C最受欢迎.现在给出M对这样的“认为 ...
- jquery第三期:js与jquery对象转换
我们开始进入jquery的学习了,jquery的学习就不那么中规中矩了,我们来看一个和javascript有所区别的地方. <!DOCTYPE html PUBLIC "-//W3C/ ...
- Android 解析内存泄漏
1.引用没释放造成的内存泄露 1.1.注册没取消造成的内存泄露 这种Android的内存泄露比纯Java的内存泄露还要严重,因为其他一些Android程序可能引用我们的Anroid程序的 ...