python中判断无向图是否有环_图01---定义和术语

图的定义和术语

G= (V,E) 表示 :V 是顶点 (vertex) 集合 , E 是边 (edge) 的集合

完全图 (complete graph)

稀疏图 (sparse graph)

  • 稀疏度(稀疏因子)
  • 边条数小于完全图的5%

密集图 (dense graph)

无向图

边涉及顶点的偶对无序 , 实际上是双通,(v, w) ,顶点之间的连线是没有方向区分的,则称这样的边是无向边,简称

fc24afa177f1afd80d2ff082558b65c1.png

有向图 (directed graph 或 digraph)

边涉及顶点的偶对是 有序

< v, w> 表示从v指向w的边(单行线),称这样的边是有向边,简称

be0a5504f9a2e635eb6f5e6e6624de61.png

标号图 (labeled graph)

536bd7aed7f257dcdeac77db9fd114fc.png

带权图 (weighted graph)

6e50b5fb082acc2d18f88b94b6c0d82a.png

无向完全图

在一个无向图中,设V是包含n个结点的集合,且对于任意两个不相同的顶点之间都有一条边将它们连接,则称该图为无向完全图。

结论:在一个含有n个顶点的无向完全图中,有n(n-1)/2条边。

有向完全图:

在一个有向图中,设V是包含n个结点的集合,且对任意两个不同结点之间都有方向相反的两条弧相连,则称该图为有向完全图。

结论:在一个含有n个顶点的有向完全图中,有n(n-1)条弧。

顶点的度 (degree)

与该顶点相关联的边的数目

  • 入度 ( in degree )
  • 出度 ( out degree )

5b421b6861328048431434b18b216b4a.png

在有向图中,将从该顶点出发的弧的数目称为该顶点的出度,用OD(v)表示;对应的,将以该顶点结束的弧的数目称为该顶点的入度,用ID(v)表示;有向图顶点的度为出度和入度之和:

D (v)=ID (v)+OD(v)。

结论:对于具有n个顶点、e条边的图,顶点

的度
与边的数目满足如下关系:

ef18dc8e5553bf8ea155ae5a5cd74f72.png

子图 (subgraph)

图G= ( V,E ),G’= ( V’,E’)中,若 V’≤V, E’≤E,并且 E’中的边所关联的顶点都在 V’ 中,则称图G’是图G的 子图

08ec5ca9c0f25d636e9fb0b80ec22d12.png

路径 (path)

从顶点Vp到顶点Vq的路径 :

顶点序列

使得

(若对有向图,则使得

) 都在 E 中

• 如果Vp到Vq之间的所 有顶点都不同,则称简单路径

路径长度 (length) :路径中的边数(如果带 权,则是所有边的权重和)

d213e8ec3ddc554ee5443da069418b3a.png

回路 (cycle,也称为环)

简单回路 (simple cycle)

  • 无环图 (acyclic graph)
  • 有向无环图 (directed acyclic graph,简写为DAG)

0ccf55138a1a4c3de61cecfbd0634895.png

无向图中,如果两个结点之间有平行边,容易 让人误看作“环”

无向图路径长度大于等于 3

• 有向图两条边可以构成环,例如<V0,V1>和 <V1,V0> 构成环

有根图

一个有向图中,若存在一个顶点 V0, 从此顶点有路径可以到达图中其它所有顶点,则称此有向图为有根的图, V0 称作图的根

  • 树、森林

eb827b65732f370966aa59a24085cccc.png

连通图

对无向图 G= (V,E) 而言,如果从 V1 到 V2 有一 条路径 (从 V2 到 V1 也一定有一条路径) ,则称 V1 和V2 是连通的 (connected)

如果无向图中任意两个顶点之间都连通,则称为连通图

如果不是连通图,则图中的极大连通子图称为连通分量

6d6b48f5534953ee5796e61dbbbc4bcf.png
连通图

图 2 中的无向图就是一个连通图,因为此图中任意两顶点之间都是连通的。

201a2aeb5dc1c60269cb9ccebadcbc02.png
图 2 连通图

无向图连通分支(连通分量)

连通分量:无向图的极大连通子图

  • 极大顶点数:再加1个顶点就不连通了
  • 极大边数:包含子图中所有顶点相连的所有边

重点区分:极大连通子图 和 极小连通子图

  • 极大连通子图是无向图的连通分量,极大要求该连通子图包含其所有的边。
  • 极小连通子图是既要保持图连通,又要使得边数最少的子图。

acbff0b5ccb6c744b315ea5785ff98da.png
连通图

860b3f4bfc2f1d91db19f175c369e6d4.png
无向图连通分量

上图的无向图有2个连通分量

有向图的强连通分量

有向图 G (V,E),如果两个顶点 vi ,vj 间 (vi<>vj ) 有一条 从 vi 到 vj 的有向路径,同时还有一条从 vj 到 vi 的有 向路径,则称两个顶点 强连通

强连通图:有向图中任意两顶点均强连通

如图 4 所示就是一个强连通图。

ce60da9d6d1e596a103b0dee5ea08f28.png
图 4

• 非强连通图有向图的极大强连通子图,称为 强连通分量 (strongly connected components)。

ee6de4bedbd49c0850d6a03d5d30d01f.png

例2,有向图,有三个强连通分量(v2也是一个强连通分量)

7ff0918cfea243f1e966470ca9ab132a.png
例2

f46b02d93e38bfd710348f7cc29b64a4.png
例2

:如果认为是v1-v3-v4的环的话,虽然可以任意顶点都连通,但是边就没有含全了,这样也是不行的!

例3:有向图,有4个强连通分量

474080e26773bc57e47561980750bbff.png

分析:这题和上一道题正好形成了对照,这里找环就可以,所以V2,V3,V4构成一个强连通分量,剩余的 v1, V5 ,V6每个自己构成一个连通分量,所以一共是4个强连通分量。

总结:在有向图中寻找强连通分量,首先尽量寻找环路,在环路上的所有结点同属一个连通分量。其次不属于任何一个强连通分量的孤立点自身是一个强连通分量。

下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达,{5},{6}也分别是两个强连通分量。

4f571fe15d478d443b5083bf99423dc7.png

网络

带权的连通图

4b8719f24822a47c426541d3e2bf139a.png

图的抽象数据类型

class 

类型名称:图(Graph)

数据对象集:G(V,E)由一个非空的有限顶点集合V和一个有限边集合E组成。 

操作集:对于任意图 G

Graph,以及
Graph 

思考

为何不允许一条边的起点与终点都是同一 个顶点?

0ab3304756d4f764005a408346f77d49.png

是否存在多条起点与终点都相同的边?

38134ea1a750435df82de6746ffc23e1.png

算法原理:(Tarjan)

用双向遍历取交际的方法求强连通分量,时间复杂度为O(N^2+M)。更好的方法是Kosaraju算法或者Tarjan算法。

Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一颗子树。

搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以盘对栈顶到栈中的节点是否为一个强连通分量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值