图的连通性问题之Prim算法和克鲁斯卡尔(Kruskal)算法

前言

这是我听老师讲课做的笔记,考试要看的。
作者:RodmaChen
关注我的csdn博客,更多数据结构与算法知识还在更新

一.概念

生成树(必考):图的极小连通子图。即:对于有n个顶点的无向连通图,无论其生成树的形态如何,所有生成树中都有且仅有
n-1条边。

如果在一棵生成树上添加一条边,必定构成一个环。

如果一个图有N个顶点和小于N-1条边,则是非连通图

N-1条边的图不一定是生成树。

最小生成树(Minimum Spanning Tree) :如果无向连通图是一个,那么,它的所有生成树中必有一棵边的权值总和最小的生成树。

二.求最小生成树的两个算法

必考考两个算法(5分)

  1. Prim算法

(1)介绍

假设G=(V,E)为一网图,其中V为网图中所有顶点的集合E为网图
中所有带权边的集合。设置两个新的集合U和T,其中集合U用于存放G 的最小生成树中的顶点,集合T存放G的最小生成树中的。令集合U的初值为U={u1}(假设构造最小生成树时,从顶点u1出发),集合T的初值为T={}

Prim算法的思想是:从所有u∈U,v∈V-U的边中,选取具有最小权值
的边(u,v),将顶点v加入集合U中,将边(u,v)加入集合T中,如
此不断重复,直到U=V时,最小生成树构造完毕,这时集合T中包含了
最小生成树的所有边。

(2)代码实现


void Prim( MGraph G, VertexType u) {
//用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边。
//记录从顶点集U到V-U的代价最小的边的辅助数组定义:
/ struct {
// VertexType adivex;
// VRType lowcost;
// }closedge[ MAX_VERTEX_NUM];
//(1) 求初始顶点下标k
i=0;
while(G.vex[i]!=u)
i++;
k=i;
//(2)初始化closedge数组
for(i=0;i<G.n;i++)
{
closedge[i].adivex=u;
closedge[i].lowcost=G.edges[k][i];
}
closedge[k]. lowcost = 0; //初始,U={u}
//(3)找剩余的顶点
for(i=1;i<G.n;i++)
{
k=minimum(closedge) ;
printf(closedge[k].adjvex;G.vex[k])
closedge[k]. lowcost=0;
for (j=0; j<G. vexnum; j++)
if (G. edgs[k][j] < closedge[j]. lowcost)
{
closedge[j].lowcost = G. edgs[k][j];
closedge[j].adjvex= G. vex[k];
}
}
}
  1. 克鲁斯卡尔(Kruskal)

算法思想(找出最小权值连接)

(1) 首先构造一个只有n个顶点但没有边的非连通图T={V, ∅ },图中每个顶点自成一个连通分量。

(2)当在边集 E 中选到一条具有最小权值的边时,若该边的两个顶点落在T中不同的连通分量上,则将此边加入到生成树的边集合T 中;否则将此边舍去,重新选择一条权 值最小的边。
(3)如此重复下去,直到所有顶点在同一个连通分量上为止。 此时的T即为所求。

三.有向无环图(DAG图)

在这里插入图片描述
一个无环的有向图称做有向无环图(directed acycline graph),简称DAG图

应用:拓扑排序

1.拓扑排序的定义

拓扑排序是将有向图的顶点排成一个线性序列的过程,它满足:

  • 若i到j有一条路径,i是j前驱,j是i的后继.
  • 若<i,j>是一条弧,则i是j直接前驱,j是i的直接后继。

顶点表示活动,用表示活动间的优先关系的有向无环图,称为 顶点表示活动的网(Activity On Vertex
Network),简称为 AOV- 网。

(2)拓扑排序的方法(Topological Sort)

在有向图中选一个没有前驱的顶点,且输出之;

从有向图中删除该顶点和以它为尾的所有弧;

重复以上两步,直至所有顶点被输出,或有向图中没有无前驱的结点

(1)采用邻接表作有向图的存储结构,且在头结点中增加一个存放顶点入度的数组。

(2)入度为0的顶点即为没有前驱的结点,删去顶点及以它为尾的弧的操作,可换成弧头顶点的入度减1的操作。

(3)为避免重复检测入度为0的顶点,另设一栈暂存所有入度为0的顶点。

在这里插入图片描述

要考

路径长度最长的路径叫做 关键路径

四.边学边练

  1. 如下图所示的一个网图,按照Prim方法,从顶点v1出发,画出
    该网的最小生成树。

本人博客:https://blog.csdn.net/weixin_46654114
本人b站求关注:https://space.bilibili.com/391105864
转载说明:跟我说明,务必注明来源,附带本人博客连接。

请给我点个赞鼓励我吧
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46654114/article/details/106729339