/*
普里姆算法的主要思想:
利用二维数组把权值放入,然后找在当前顶点的最小权值,然后走过的路用一个数组来记录
*/
# 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)算法的更多相关文章

  1. 普里姆Prim算法介绍

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

  2. 图解最小生成树 - 普里姆(Prim)算法

    我们在图的定义中说过,带有权值的图就是网结构.一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接 ...

  3. JS实现最小生成树之普里姆(Prim)算法

    最小生成树: 我们把构造连通网的最小代价生成树称为最小生成树.经典的算法有两种,普利姆算法和克鲁斯卡尔算法. 普里姆算法打印最小生成树: 先选择一个点,把该顶点的边加入数组,再按照权值最小的原则选边, ...

  4. 图的普里姆(Prim)算法求最小生成树

    关于图的最小生成树算法------普里姆算法 首先我们先初始化一张图: 设置两个数据结构来分别代表我们需要存储的数据: lowcost[i]:表示以i为终点的边的最小权值,当lowcost[i]=0说 ...

  5. 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

    图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...

  6. 最小生成树-普利姆(Prim)算法

    最小生成树-普利姆(Prim)算法 最小生成树 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一种特殊的图),或者 ...

  7. 图论---最小生成树----普利姆(Prim)算法

    普利姆(Prim)算法 1. 最小生成树(又名:最小权重生成树) 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一 ...

  8. 经典问题----最小生成树(prim普里姆贪心算法)

    题目简述:假如有一个无向连通图,有n个顶点,有许多(带有权值即长度)边,让你用在其中选n-1条边把这n个顶点连起来,不漏掉任何一个点,然后这n-1条边的权值总和最小,就是最小生成树了,注意,不可绕成圈 ...

  9. 最小生成树之Prim(普里姆)算法

    关于什么是Prim(普里姆算法)? 在实际生活中,我们常常碰到类似这种一类问题:如果要在n个城市之间建立通信联络网, 则连通n个城市仅仅须要n-1条线路.这时.我们须要考虑这样一个问题.怎样在最节省经 ...

随机推荐

  1. Python 在Windows下安装matplotlib

    windows下安装很麻烦,使用easy_install 安装报错  提示缺少freetype 和png 后经多方查询,最终安装成功 以下是安装过程 前提你的Python环境已经搭建好了 1.前提需要 ...

  2. Android 自定义View之BounceProgressBar

    之前几天下载了很久没用了的桌面版酷狗来用用的时候,发现其中加载歌曲的等待进度条的效果不错(个人感觉),如下: 然后趁着这周末两天天气较冷,窝在宿舍放下成堆的操作系统作业(目测要抄一节多课的一堆堆文字了 ...

  3. 反思java web的发展

    本来网站都是一个个静态HTML的,但很快我们就不满足于这样了.动态网页应运而生.一开始是Servlet.其代码类似于下面这样.主要是Java代码,然后用out一点一点输出HTML代码.当然代码无比丑陋 ...

  4. bzoj2015 [Usaco2010 Feb]Chocolate Giving

    Description Farmer John有B头奶牛(1<=B<=25000),有N(2*B<=N<=50000)个农场,编号1-N,有M(N-1<=M<=10 ...

  5. hdu 1242 Rescue_bfs+优先队列

    翻出以前的代码看看 题意:走迷宫,遇到敌人要花一分钟. #include<iostream> #include<queue> using namespace std; char ...

  6. 什么是OAuth

    什么是OAuth 如今很多网站的功能都强调彼此间的交互,因此我们需要一种简单,标准的解决方案来安全的完成应用的授权,于是,OAuth应运而生,看看官网对其的定义: An open protocol t ...

  7. C#—Dev XtraTabControl动态增加Tab和关闭选项卡方法

    C#—Dev XtraTabControl动态增加Tab和关闭选项卡方法,有需要的朋友可以参考下. 记录一下以免以后忘了 添加using DevExpress.XtraTab; 双击listview增 ...

  8. SQL自动创建表和自动插入字段实例

    USE [UMoney] GO /****** Object: StoredProcedure [dbo].[WCL_WorkerStatDailyWrite] Script Date: 10/08/ ...

  9. 使用HTML5/CSS3制作便签贴

    利用HTML5/CSS3,仅用5步就可以制作便签贴效果的HTML页面,效果图如下: (注:图里的文字纯属杜撰,搞笑目的,如有雷同,纯属巧合,谢谢!) 注:该效果可以在Safari, Chrome,Fi ...

  10. 【MFC学习笔记-作业9-基于单击响应的计算平均成绩】【】

    要求..单击出现 一个输入成绩的框,点确定后,计算平均成绩 意义很大~ 完成对话框   再写个鼠标点击的响应部分 鼠标点击的响应部分为难点.... void CWj1401_0302140107_9V ...