[题目大意]
- 给定一张图,求最少加入几条边可以使得整个图成为一个边双连通图。
[分析题解]
- 经典的老题目了,学双联通分量必做。前一段时间做了一次,结果不断的WA-_-一怒之下扔掉,今天又回来做,详细的修改了程序框架之后重写很快就过了。
- 具体的说也是非常简单:求双联通分量,染色,缩点,然后求度为1的点数,答案就是(这个数+1) Div 2。
- 因为有重边,以前不太明确怎么处理,直到看了Guo神牛的题解之后,恍然大悟,只需要在Dfs的同时,记下到这个边的这条边的反向边的编号,到时候不要再从这个走回去,但是可以从重边走回去。限制边,而不是限制点,这样处理就搞定了重边的情况。
- 其他的就比较简单了,按照Low和Dfn的定义,如果某个点拓展完后Low=Dfn,那么栈中从栈顶到这个店为止的部分都属于同一个双联通分量。这个由Dfs树的性质决定的。这样求出来之后,只需要对这些点进行染色,不需要真的缩点,只要再去重新枚举原图中的边,向新的颜色不同的顶点之间加边即可。又由于双联通分量的定义,这样新的图一定是一个树,如果不是一个树,那有环的部分按照定义是应该在同一个双联通分量中的。然后求求度数,计算输出即可。
[个人代码]
fayaa.com/code/view/26770/
[相关链接]
- http://www.byvoid.com/blog/biconnect/zh-hans/
- http://www.byvoid.com/blog/pku-3177/
http://www.cnblogs.com/ACystalMoon/articles/2381205.html
-
http://www.cnblogs.com/rainydays/archive/2011/07/06/2099524.html
[启发总结]
- 特别是第四个!以前我了解了Low的定义,但是却没有发现这个区别:我们平时使用的Low,都是其子孙通过一条返祖边直接到达的点来决定的。如果我们把这个限制取消掉,按照其提供的做法,可以很简单的对双联通分量进行染色。
0;
}