普里姆算法(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),适用于稠密图。

相关文章推荐

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

最小生成树之Prime(普里姆)算法 最小生成树:是在一个给定的无向图G(V,E)中求一棵树T,使得这棵树拥有图G中的所有顶点,且所有边都是来自图G中的边,并且满足整棵树的边权之和最小。 如上...

普里姆(Prim)算法

从连通网N=(U,E)中找最小生成树T=(U,TE) 。 ⑴ 若从顶点v0出发构造,U={v0},TE={}; ⑵ 先找权值最小的边(u,v),其中u∈U且v∈V-U,并且子图不构成环,则U= U...

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

1. 基本思想: 设G=(V,E)是连通网,T=(U,D)是最小生成树,V,U是顶点集合,E,D是边的集合 ①若从顶点u开始构造最小生成树,则从集合V中取出顶点u放入集合U中,标记顶点v的visi...
  • yxmmao
  • yxmmao
  • 2016年06月04日 22:05
  • 255

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

Prim算法是解决最小生成树的经典算法之一。本博客以个人的理解简略地对Prim算法进行介绍以及解剖。...

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

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

普里姆算法(prim)的实现

从单一顶点开始,普里姆算法按照以下步骤逐步扩大树中所含顶点的数目,直到遍及连通图的所有顶点。 输入:一个加权连通图,其中顶点集合为V,边集合为E;初始化:Vnew = {x},其中x为集合V中的...

普里姆(prim)算法

Prim算法 普里姆算法(Prim算法)思想 普里姆算法基本思想是以顶点为主导地位:从起点出发,通过选择当前可用的最小权值边依次把其他顶点加入到生成树当中。 下面对算法的图例描述 ...

数据结构之---C语言实现最小生成树之prim(普里姆)算法

数据结构之---C语言实现最小生成树之prim(普里姆)算法
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:普里姆算法(Prim)
举报原因:
原因补充:

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