图论相关总结
图的构成:
1)图:
G = (V,E) vertex,edge
集合表示: V={ } E={ };//这也就是向前星存图的基础
2)有向图与无向图:
3)有向图:
顶点度 (deg)= 出度(indeg) + 入度(outdeg)
欧拉回路:
欧拉回路:图G中经过每条边一次的回路。
欧拉路径:图G中经过每条边一次的路径。
欧拉图:存在欧拉回路的图。
半欧拉图:存在欧拉路径且不存在欧拉回路的图。
定理1:无向图G为欧拉图,当且仅当G连通且每个点的度数均为偶数。
推论1:无向图G为半欧拉图,当且仅当G连通且除了两个点度数为奇数外,其余个点度数均为偶数。
定理2:有向图G为欧拉图,当且仅当G的基图连通且每个点入度等于出度。
推论2:有向图G为半欧拉图,当且仅当G连通且除了uu入度比出度大11,vv出度比入度大一外,其余个点入度均等于出度。
性质1:设C为欧拉图G中一条简单回路,将C中的边从图GG中删去后得到G′′,G′
的每个极大连通子图均为欧拉图。
性质2:设C1、C2
C1、C2为图G中没有公共边,但至少有一个公共点的简单回路,则C1、C2可以合成一个新的回路。
Tarjan算法:
基于图的DFS遍历。
时间
在DFS时,按照每个点第一次被访问的顺序,标记每个结点。该标记称为时间戳,记作dfn(u)
搜索树
在DFS时,每个结点只会被遍历一次。若图连通,则所有连接一个未访问结点的边会构成一棵树,不连通则构成一个森林。
追溯值
从u出发能访问到的点中,dfn的最小值,称为追溯值,记作low(u)
强连通分量
定义
有向图的极大强连通子图,称为强连通分量,简称SCC。
算法流程
枚举每个为访问的结点进行DFS,并将结点压入栈中。
在DFS时计算dfn,low。
若当前访问结点u满足dfn(u)=low(u),则栈中u及其之后的结点从栈中弹出,这些结点构成一个强连通分量。 重复以上过程,直至所以结点都被访问。
割点
无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多,就称这个点集为割点集合
判定:
1.u为当前搜索树的根结点且uu的子树数量大于1。
2.u不为根且存在树边(u,v)使dfn(u)<=low(v)
割边
在一个无向图中,如果有一个边集,删除这个边集以后,图的连通分量增多,就称这个边集为割边集合。
如果某个割边集合只含有一条边(u,v),那么(u,v)称为一条割边
判定:
- 一条边(u,v)为割边,当且仅当(u,v) 在搜索树中且dfn(u)<low(v)
点双连通分量
对于一个连通图,若任意两点之间至少存在两条“点不重复”的路径,则称该图是点双连通的。
对于一个图,点双连通的极大子图称为点双连通分量
不同的点双连通分量最多只有一个公共点,而这个公共点一定是割点。
任意的割点至少是两个不同点双连通分量的公共点。
判定:
仿照求解强连通分量的方法,在dfs时维护一个栈,若当前边(u,v)满足dfn(u)≤low(v)
说明u为割点。将栈中的结点依次弹出,但u不弹出。
注意割点属于多个点双连通分量。
边双连通分量
对于一个连通图,若任意两点之间至少存在两条“边不重复”的路径,则称该图是边双连通的。
对于一个图,边双连通的极大子图称为边双连通分量
割边不属于任何一个边双连通分量
根据变双联通分量的定义,只需求一遍割边。然后删去割边,原图会分裂成若干个连通块,每个连通块就是一个边双连通分量。
DAG :有向无环图
拓扑排序
扫描每个结点,把入度为 0的结点加入队列。
从队列开始,每次取出队首元素,扫描其出边,将其到达的顶点入度减1
重复2,直到队列为空。
其他连通相关
https://blog.csdn.net/lin375691011/article/details/18092577
强连通图,强连通子图(分支)
https://blog.csdn.net/lixiaoguai2017/article/details/85457160
距离与连通性