图论-连通图学习总结

一、有向图

 有向图的问题就是直接Tarjan求强连通分量,然后搞就行。

二、无向图

1、割点和桥

 无向图的割点和桥的求法和有向图的差不多,唯一多的限制就是不能从该点往他的父亲走,当然可能会有重边。但有统一的解决方法,那就是标记走过的边,既然是无向图,那么加边的时候肯定加两条边(这俩边的编号关系就是相互^1),那么就走一条边时,把另一条边标记即可。

        if(g[i].use) continue;
        g[i].use=g[i^1].use=1;

(1)割点:假设dfs时,点u是点v的父亲。只需要判断low[v]>=dfn[u]即可,也就是说v点没有指向u祖先的边,那么割掉u后,v和u的祖先肯定就不连通。

定义:在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多,就称这个点集为割点集合。如果某个割点集合只含有一个顶点X(也即{X}是一个割点集合),那么X称为一个割点。

(2)桥:求桥时只需判断low[v]>dfn[u]即可,等于也不行,割掉这条边u和v就不连通了。

    			lowu=min(lowu,lowv);
			if(lowv>dfn[u])
			{
				bs[++tot]=Bridge(u,v);
				if(bs[tot].from>bs[tot].to)
					swap(bs[tot].from,bs[tot].to);
			}	

定义:假设有连通图G,e是其中一条边,如果G-e是不连通的,则边e是图G的一条割边。此情形下,G-e必包含两个连通分支。(割掉该边时,图的连通分量增多)。

(3)点双连通分量:假设dfs时,点u是点v的父亲,也是判断low[v]>=dfn[u]即可。点双和割点密切相关,因为点双中没有割点,所以某些点双的公共点就是割点,割点是各点双的分界点,所以遇到割点时,也就意味着有点双已经形成,并且由于所有的点只遍历一遍,所以不能将割点出栈,要、之后还要把它放进他属于的某些点双里。(bcc存的是各点双里的点,bccnum代表点双的个数。)

            if(low[v]>=dfn[u])
            {
                iscut[u]=1;
                bccnum++;
                while(sta[top]!=v)
                    bcc[bccnum].push_back(sta[top--]);
                bcc[bccnum].push_back(sta[top--]);
                bcc[bccnum].push_back(u);
            }

定义:对于一个连通图,如果任意两点至少存在两条点不重复路径,则称这个图为点双连通的(简称双连通)。点双连通图的定义等价于任意两条边都同在一个简单环中,对一个无向图,点双连通的极大子图称为点双连通分量(简称双连通分量)。(也就是点双中没有割点。)可以理解为若干个有边相交的环。

特别性质:一个点双中,如果某些点在一个奇圈中,其他点也在某些奇圈中。

(4)边双连通分量:假设dfs时,点u是点v的父亲,也是判断low[v]>dfn[u]即可。同理,边双和桥密切相关,因为边双中没有桥,所以连接两个边双的就是桥。

定义:如果任意两点至少存在两条边不重复路径,则称该图为边双连通的。边双连通图的定义等价于任意一条边,至少在一个简单环中。边双连通的极大子图称为边双连通分量。

不管求什么,都离不开Trajan,清楚dfn,low数组以及Trajan算法的思想,那些题总是能做出来的。(但是我太菜。。。。。。。)

 

 

你可能感兴趣的:(=====图论=====,=====结论=====)