普里姆算法最小生成树唯一吗_算法基础:图的相关算法知识笔记

本文深入探讨图的相关算法,包括最小生成树的概念和两种经典算法——普里姆算法与克鲁斯卡尔算法的详细步骤。同时介绍了拓扑排序的定义、执行步骤及其在工程活动优先级规划中的应用。

一、图的相关算法

1、图的分类知识

如下图:

       94f5f59e4495db0b8e0aef71c321daae.png      

2、生成树概念

对连通图进行遍历,过程中所经过的边和顶点的组合可看做是一棵普通树,通常称为生成树。

连通图的生成树具有这样的特征:边的数量 = 顶点数 - 1

3、最小生成树

在连通网的所有生成树中,所有边的代价和权值最小的生成树,称为最小生成树。

       9c319cba81bddc633306ccbec20aaede.png      

4、 最小生成树的算法

4.1普里姆算法(Prim算法)

它是图论中的一种算法,可在加权连通图里搜索最小生成树。即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(Robert C. Prim)独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。

算法如下:

void prim(MGraph g,int v)

{

    int lowcost[MAXV],min,n=g.vexnum;

    int closest[MAXV],i,j,k;

    for (i=0;i

    {   

        lowcost[i]=g.edges[v][i];

        closest[i]=v;

    }

    for (i=1;i

    {   

        min=INF;

        for (j=0;j

            if (lowcost[j]!=0 && lowcost[j]

            {   

                min=lowcost[j];k=j;  

            }

        printf("  边(%d,%d)权为:%d\n",closest[k],k,min);

        lowcost[k]=0;           //标记k已经加入U

        for (j=0;j

            if (g.edges[k][j]!=0 && g.edges[k][j]

            {   

                lowcost[j]=g.edges[k][j];closest[j]=k; 

            }

    }

}

算法过程

       2976154142df1a93450126bcc5dc7bda.png      

4.2 克鲁斯卡尔(Kruskal)算法

1、概念

该算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。

2、算法步骤

1. 把图中的所有边按代价从小到大进行排序;

2. 把图中的n个顶点看成独立的n棵树组成的森林;

3. 按权值从小到大选择边,所选的边连接的两个顶点,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。

4. 重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。

3、算法过程

       8e5d0e0f340fb87c609eab33890a9180.png              8e5d0e0f340fb87c609eab33890a9180.png      

5、最小生成树算法的应用

比如要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,因为铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低。这个时候需要找到带权的最小生成树,来解决这个问题。

二、拓扑排序

1、定义

由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

2、AOV网

在工程领域,一个大的工程通常会被划分为许多较少的子工程,当子工程都完成了,那么整个大工程也就完成了。若以顶点表示活动,用有向边表示子工程之间的优先关系。这样的有向图以顶点表示活动的网就是AOV网。AOV网表示了子工程之间的优先关系,也是活动进行时的制约关系。

3、拓扑排序

拓扑排序是将AOV网中所有的顶点排成一个线性序列的过程。并且满足:若在AOV网中从顶点A到B有一条路径,那么A比然在B之前。

4、执行步骤

(1) 选择一个入度为0的顶点并输出之;

(2) 从网中删除此顶点及所有出边。

循环结束后,若输出的顶点数小于网中的顶点数,则输出“有回路”信息,否则输出的顶点序列就是一种拓扑序列。 

IT技术分享社区

个人博客网站:https://programmerblog.xyz

275839dfe7b96570bac99cacaf94d95a.png

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值