强连通
若一张有向图的节点两两相互可达,则称这张图是强连通的
强连通分量((SCC)):极大的强连通子图
DFS树
对一个图任取一个节点,跑(DFS)建出的树
树边:每次搜索找到一个还没有访问过的节点的时候就形成了一条树边
返祖边:也叫回边,指向祖先节点的边
横插边,在搜索时遇到了一个已经访问过的节点,但是这个节点并不是当前节点的祖先时形成的
前向边:搜索时遇到子树中的节点的时候形成的
在判断强连通时,横向边和前向边肯定对形成环没有任何帮助,唯一能形成环的是返祖边
(tarjan)算法:(dfn)数组:时间戳,(low)数组:往上能走到哪
处理横向边:退栈
对称性优化的(2-sat)待更
双连通
割点:对于一个无向图,如果把一个点删除后这个图的极大连通分量增加了,那么这个点就是这个图的割点
割边(桥):对于一个无向图,如果删掉一条边后图中的连通分量数增加了,则称这条边为桥或割边
边双连通:在一张连通的无向图中,对于两个点(u)和(v),如果无论删去哪一条边,都不能使他们不连通,那么(u)和(v)边双连通
点双连通:在一张连通的无向图中,对于两个点(u)和(v),如果无论删去哪个点,都不能使他们不连通,那么(u)和(v)点双连通
边双具有传递性,若(x,y)边双,(y,z)边双,那么(x,z)边双
点双不具有传递性
(dfs)求桥,割点
桥:对无向图,跑出一颗(dfs)树,有一颗非树边,那么这条路径上都不是桥,可以树上差分求桥
两个点是否在一个边双:两个点的树上路径中没有桥
割点:一个点不是割点的条件是他所连的儿子每个都有一条返祖边能跨过他,把非树边路径上的点加入到同一个连通块里,若一个点和周围的点是否在同一个连通块里,则不是割点
两个点是否是点双:点之间的边是否在同一个连通块内
(tarjan)求割点:判断(low[v_i]<dfn[u]),存在(low[v]≥dfn[u])一点是割点,根节点特判度数小于(2)
(tarjan)求点双:每个割点就是点双分界线
(tarjan)求桥:判断(low[v]≤dfn[u]),存在(low[v]>dfn[u])一定是桥
(tarjan)求边双:桥是分割点
双连通缩点:图会变成树,将图的删边博弈变成树的删边博弈
prufer序列
树和序列的双射关系
树映射成序列做组合数更合适
待更
三元环计数
big-small
待更