/*
普里姆算法的主要思想:
利用二维数组把权值放入,然后找在当前顶点的最小权值,然后走过的路用一个数组来记录
*/
# 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. jquery load(URL,FUNCTION(){}) 异步加载页面

    $("#btnSearch").click(function () { var queryUrl = '/Report/LoadInsClassifFileNew'; if ($( ...

  2. alsa音频驱动科普第一课

    做linux音频编程对alsa应该不陌生. 但是对于刚接触这块技术的同学来说是一件困难的事情.原因在于:网上关于alsa的资料太少了,特别国内的资料更是大部分重复.对于初学者来说特别苦恼. 由于笔者经 ...

  3. 做为一个Java程序员,你需要哪些傍身的技能?

    最近总有些断断续续的思考,想想从我入行以来,我到底学会了什么,做成过什么,以后要做什么,如何提升自己······· 工作3年了,常听人说3年,5年,10年是程序员的坎,每过一个都会有新的想法,新的改变 ...

  4. Zigbee2007协议中文介绍

    Zigbee2007中文介绍ZigBee2007规范定义了ZigBee和ZigBee Pro两个特性集,全新的ZigBee 2007规范建立在ZigBee2006之上,不但提供了增强型的功能而且在某些 ...

  5. mysql 匹配update

    update 语句示例: UPDATE `zjzc`.`QRTZ_SCHEDuler_state` SET `ip`='220.191.34.246' WHERE `sn`='3117764' and ...

  6. C# 导出 excel 复杂格式 html导出

    /// <summary> /// 夜班津贴统计导出 /// </summary> public void ExportOtStat(string data) { var in ...

  7. [转]JSOM绘制地图区块及航道路径

    From :http://support.sailstech.com/kb/c73fd2405d79911253e568ccdc69256dc7c8fb5c/josm 步驟一: 使用JOSM繪製地圖區 ...

  8. yum lamp for Centos6.4

    1,Centos6.4  yum lamp#!/bin/sh<<cat#echo Ruiy!#Create by Ruiy on 2015-03-27----cat yum install ...

  9. Sonar入门(二): Maven集成Sonar

    Sonar对maven提供了简单可配的支持,要做的事情很简单——在maven/conf下settings.xml <profiles></profiles>标签之间添加如下内容 ...

  10. 关于CMCC(中国移动)、CU(中国联通)、CT(中国电信)的一些笔记

    一.三大运营商网络 CMCC(ChinaMobileCommunicationCorporation):GSM(2G).TD-SCDMA(3G).TD-LTE(4G); CU(China Unicom ...