普里姆算法(Prim)

原创 2015年10月05日 22:26:40

  普里姆(Prim)算法是一种构造性算法。假设G=(V,E)是一个具有n个顶点的带权连通图,T=(U,TE)G的最小生成树,其中UT的顶点集,TET的边集,则从v0开始构造最小生成树T的步骤如下:
  1) 初始化={v0},将v0到其他顶点的所有边作为候选边。
  2) 重复以下操作n1次,使得其他n1个顶点被加入到U中:
  2.1) 从候选边中挑选权值最小的边输出,设该边在VU中的顶点是v, 将v加入到U中,删除和v关联的边;
  2.2) 考察当前VU中的所有顶点vi,修正候选边。若(v,vi)的权值小于原来和vi关联的候选边,则用(v,vi)取代后者作为候选边。
  为了便于在集合UVU之间选择权值最小的边,建立了两个数组vsetlowcostvset[i]=1表示顶点iU中,vset[i]=0表示顶点iVU中。lowcost数组存放VU顶点到U中顶点的最小值,即lowcost[i]表示VU中顶点iU中顶点的最短边的权值。
  初始时lowcost[i]=g.edges[v0][i],
  在扩充顶点v后,若vset[j]=1(表示为VU中顶点), 且 g.edges[v][j]<lowcost[j], 说明VU中的顶点jU中顶点v的边权值更短, 需修改为lowcost[j]=g.edges[v][j]
  普里姆算法如下:  

void prim(MGraph g,int v)
{
    int lowcost[MAXV],min,n=g.vexnum;
    int closest[MAXV],i,j,k;
    for (i=0;i<n;i++)           //给lowcost[]和closest[]置初值
    {   
        lowcost[i]=g.edges[v][i];
        closest[i]=v;
    }
    for (i=1;i<n;i++)           //找出n-1个顶点
    {   
        min=INF;
        for (j=0;j<n;j++)       //在(V-U)中找出离U最近的顶点k
            if (lowcost[j]!=0 && lowcost[j]<min) 
            {   
                min=lowcost[j];k=j;  
            }
        printf("  边(%d,%d)权为:%d\n",closest[k],k,min);
        lowcost[k]=0;           //标记k已经加入U
        for (j=0;j<n;j++)       //修改数组lowcost和closest
            if (g.edges[k][j]!=0 && g.edges[k][j]<lowcost[j]) 
            {   
                lowcost[j]=g.edges[k][j];closest[j]=k; 
            }
    }
}

  普里姆算法的时间复杂度为O(n2),适用于稠密图。

最短路径算法汇总

Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终...
  • jerrychu19
  • jerrychu19
  • 2016年07月02日 22:12
  • 626

数据结构 第15讲 一场说走就走的旅行——最短路径

一场说走就走的旅行——最短路径 本内容来源于《趣学算法》,在线章节:http://www.epubit.com.cn/book/details/4825 有一天,孩子回来对我说:“妈妈...
  • rainchxy
  • rainchxy
  • 2017年09月14日 11:06
  • 1418

Prim算法(普里姆算法)

普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。 算法描述 ...
  • Lieacui
  • Lieacui
  • 2016年06月24日 11:02
  • 404

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

最小生成树之Prim(普里姆)算法
  • u012965373
  • u012965373
  • 2015年08月11日 15:18
  • 1337

图的最小生成树与最短路径

一个连通图的生成树是一个极小的连通子图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边。那么我们把构造连通网的最小代价生成树称为最小生成树。 找连通网的最小生成树,经典的有两种算法,普里姆算法...
  • u010013164
  • u010013164
  • 2014年09月03日 11:22
  • 5640

最小权顶点覆盖问题的C++代码(完整)

  • 2009年12月24日 08:53
  • 2KB
  • 下载

prim算法的实现过程

为什么要构建最小生成树呢?其实原理很简单。打个比方,现在某一个乡镇有n个村,那么这n个村肯定是联通的。现在我们打算在各个村之间搭建网线,实现村村通的工程。那么有什么办法可以实现村村互通,同时又使得最后...
  • gz153016
  • gz153016
  • 2016年05月23日 20:25
  • 493

Prim算法 之 Java详解

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

算法7_图的应用详解

概述 最小生成树——无向连通图的所有生成树中有一棵边的权值总和最小的生成树 拓扑排序 ——由偏序定义得到拓扑有序的操作便是拓扑排序。建立模型是AOV网 关键路径——在AOE-网中有些活动可以并...
  • wang_zhenwei
  • wang_zhenwei
  • 2016年08月01日 14:53
  • 1400

设计一个算法,采用BFS方式输出图G中从顶点u到v的最短路径(不带权的无向连通图G采用邻接表存储)

思想:图G是不带权的无向连通图,一条边的长度计为1,因此,求带顶点u和顶点v的最短的路径即求顶点u和顶点v的边数最少的顶点序列。利用广度优先遍历算法,从u出发进行广度遍历,类似于从顶点u出发一层一层地...
  • wuruiaoxue
  • wuruiaoxue
  • 2015年07月18日 10:35
  • 1894
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:普里姆算法(Prim)
举报原因:
原因补充:

(最多只允许输入30个字)