C++图笔记(三)有向无环图(及最小生成树(略))以及剩下的排序

目录

一,定义:

1,有向无环图

 2,拓朴排序

 1,每个顶点出现且仅仅出现一次。

 2,若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。

二,DAG的性质

性质1.   从任意一个起点进行dfs,必不会陷入死循环。

性质2.   入度为0的点信息确定,删掉入度为0的点以及出边后,新的入度为0的点信息也唯一确定。

三,拓扑排序的遍历

 四,例题

1,有向图的拓扑序列

使用图片理解拓扑排序(也是该图的模拟过程)

1,在不考虑边权的情况下 输入数据为:

由此建立邻接表。可得第一次入度为零的点为“1”“2” 将此两点入度

所以先将1指向的点和边删除,并将指向的点(3,4)的入度-1;得到下图

由于第一次入度为零的点还有“2”,将1删除后,点“2”还在队中,所以同上操作,得到图三

由上图得:点3的入度为零,所以按照操作将“3”入队,出队,删边,删除边指向的点的入读-1;

同上操作,此时删除点“4;则点“5”的入读=0;

经过删除。得到点六,所以存在拓扑排序,该图为DAG

2,求最长路

五,最小生成树

1,定义:

2,基本性质

1. 生成树是一个连通子图,是给定图的一个子集,它连接了所有节点且没有环。(有环可以减少一条边)

2. 生成树形态不止一种,且含有图中全部n个顶点,以及包含图中n-1条边。

3,求解方法:

        1、Kruskal  复杂度:n(mlogm)

        2、例题 详见下:​编辑

代码:


一,定义:

1,有向无环图

如果有一个非有向无环图,且A点出发向B经C可回到A,形成一个环。将从C到A的边方向改为从A到C,则变成有向无环图。有向无环图的生成树个数等于入度非零的节点的入度积。(from baidu)

若一个有向图不存在环,则称为有向无环图【字面意思】这个东西就叫做DAG(Directed Acyclic Graph),

如图所示:

 2,拓朴排序

在图论中,拓扑排序(Topological Sorting)是一个有向无环图的所有顶点的线性序列。且该序列必须满足下面两个条件:

 1,每个顶点出现且仅仅出现一次


 2,若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。

由拓朴排序的定义可知:只有DAG才有拓扑排序,其余没有拓扑排序一说。

二,DAG的性质

性质1.   从任意一个起点进行dfs,必不会陷入死循环。


性质2.   入度为0的点信息确定,删掉入度为0的点以及出边后,新的入度为0的点信息也唯一确定。

三,拓扑排序的遍历

在dij和spfa等算法中,任意点都会重复更新多次,所以会导致时间复杂度提高。在拓扑排序中,不是从起点(任意点)开始遍历,而是从入度为0的点开始遍历,这样该点就不会有其它点进行更新它。所以这样每个点和边都只会被遍历一次。

所以拓朴排序的时间复杂度为n(n+m).

拓扑排序的大致过程:

  1. 从 图中选择一个 入度为0的顶点并入度。
  2. 当该节点出队时,将该节点所指向边的节点入度-1如果新节点入度为零,则将新节点入度。
  3. 重复 1 和 2 直到当前图为空或当前图中不存在入度为零的顶点为止。后一种情况说明有向图中必然存在环。当所有节点都入过队列,则当前图存在拓扑排序,则该图为DAG图。

 四,例题

1,有向图的拓扑序列

题目:(要求详见图)

使用图片理解拓扑排序(也是该图的模拟过程)

1,在不考虑边权的情况下 输入数据为:
6 7(点数,边数)
1 3
1 4
2 5
4 5
3 6
5 6
3 4

由此建立邻接表。可得第一次入度为零的点为“1”“2” 将此两点入度

所以先将1指向的点和边删除,并将指向的点(3,4)的入度-1;得到下图

 

由于第一次入度为零的点还有“2”,将1删除后,点“2”还在队中,所以同上操作,得到图三

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值