一、图的相关算法
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及串口基础知识硬件:断路器、接触器、继电器基础知识