算法基础:图的相关算法知识笔记

一、图的相关算法

1、图的分类知识

如下图:

             

2、生成树概念

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

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

3、最小生成树

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

             

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<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; 

            }

    }

}

算法过程

 

             

 

4.2 克鲁斯卡尔(Kruskal)算法

1、概念

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

2、算法步骤

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

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

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

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

3、算法过程

                           

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

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

 

二、拓扑排序

1、定义

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

2、AOV网

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

3、拓扑排序

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

4、执行步骤

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

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

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

IT技术分享社区

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

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

posted @ 2020-09-17 07:11  天使不哭  阅读(12)  评论(0编辑  收藏  举报  来源