普里姆(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条线路.这时.我们须要考虑这样一个问题.怎样在最节省经 ...
随机推荐
- python super研究
# encoding=utf-8 class A(object): def __init__(self): print "初始化a" def run(self): print &q ...
- groovy 弹出菜单
import groovy.swing.* import javax.swing.* import java.awt.* def swing = new SwingBuilder() swing.fr ...
- SQL Server 提高创建索引速度的 2 个方法
方法 1. 使用tempdb来提速 create index index_name on table_name (column_list) with(sort_in_tempdb = on); 方法 ...
- Ubuntu Mysql开通外网访问权限
Ubuntu Mysql开通外网访问权限 1.编辑 my.cnf 文件: sudo vi /etc/mysql/my.cnf 2.将绑定地址行注释掉或者修改为指定 IP #bind-addre ...
- C语言运算符的优先级
熟悉C语言的同学都知道,C语言众多的运算符及繁琐难记的优先级总是搞得我们这些C初学者头大.那么本文就 对C语言中所有的运算符进行汇总,并对其优先级进行一定的介绍. 这里虽然对所有C运算符的优先级进行了 ...
- Hortonworks HDP Sandbox定制(配置)开机启动服务(组件)
定制Hortonworks HDP开机启动服务能够这样做:本文原文出处: http://blog.csdn.net/bluishglc/article/details/42109253 严禁不论什么形 ...
- C#编程打字指法练习
很惊讶昨晚写的第一篇学习笔记竟然有个评论了,只是今天还是对基础知识提不起精神,还是先看那三本书了解一下程序开发的大概流程吧. 今天不知道怎么闲逛就找到了这个网站,说是专门用于编程练习的,用google ...
- T-SQL索引
索引 使用索引可以提高查询速度,不是越多越好,会损耗存储空间.应用于出现在where子句中的列建立索引.可以使用sql server 内置工具Profiler捕捉在SQL Server实例上执行的活动 ...
- Type.GetType()在跨程序集反射时返回null的解决方法
在开发中,经常会遇到这种情况,在程序集A.dll中需要反射程序集B.dll中的类型.如果使用稍有不慎,就会产生运行时错误.例如使用Type.GetType("BNameSpace.Class ...
- Android博客
各版本SDK Tools及ADT下载技巧:http://www.cnblogs.com/zhjsll/p/5147553.html 深入浅出SlidingMenu:http://www.cnblogs ...