Tarjan的求双连通分量算法
哎~气死我了!昨天晚上都写好了……一不小心把网页关了,写的全没了……MD
什么是双连通分量DCC(Double connected component)?
首先说一下一个无向连通图,若去掉任一点或任一边都不影响该图的连通性(本来是连通的,现在仍连通),那么该图是一个双连通图(该图的DCC只有一个即本身)。
DCC是一个无向连通图(注意是无向连通图不是有向图,别把强连通分量与他们搞混了!)的子图,该子图是一个双连通图(尽可能大的双连通图,也就是尽可能包含更多的点)。也就是说一个无向连通图的DCC需要满足三个条件:1.它是该无向连通图的子图 2.该子图是一个双连通图 3.使该子图尽可能的大
什么是割点、桥?
一个无向连通图,去掉一点或一边后影响了改图的连通性(本来是连通的,现在不连通了),则该点就是割点或该边就是桥。
求DCC的算法的分析,我就不说了……就是说了也难以理解,直接贴上加注释的code,你自己画个图,跟着程序走一遍,慢慢体会体会!
//----------DCC------------------ int dfn[MAXNODE],low[MAXNODE],index;//dfn记录各点被访问次序,low是追溯到DCC的根节点//的dfn的值,当根节点的某个直接儿子节点的low值大于或等于根节点的dfn的值时,就可以从//栈中取值了,直到取到根节点为止时一个DCC int stack[MAXNODE],top;//栈:用深搜搜索节点并依次存储各个节点—以便于找到DCC(即当//发现环时就是一个DCC,用low标记的,从该栈中取值取到该根节点为止) int id_dcc[MAXNODE],cnt_dcc;//id_dcc:名副其实即DCC的id(编号),存储各节点的所在的//编号(就是你给他们编的号,从1-n)cnt_dcc就是编号下标! int father[MAXNODE];//由于求DCC是在一个无向连通图中,即为双向的图,该father就是为了//防止某一节点又访问上一个节点(上一个节点搜出该节点) void DFS_DCC(int cur){int next; //next为cur节点下的节点 dfn[cur]=low[cur]=++index; stack[++top]=cur;for(Node *p=G[cur];p;p=p->next) { next=p->num;if(!dfn[next]) { father[next]=cur; //额,可以不用。。 DFS_DCC(next);if(low[next]<low[cur]) //更新low使每一个DCC中的low的值==根节点low值 low[cur]=low[next];if(low[next]>=dfn[cur])//当发现节点cur的儿子节点next的low值>=dfn[cur] { //则就要取栈,即是时候取出DCC了。为什么?因为不 cnt_dcc++; //这样就不对了^_^!(具体原因,自己举几个例子try) do { next=stack[top--]; id_dcc[next]=cnt_dcc; }while(next!=cur); top++; //这里为什么要++因为连着DCC是有共同节点的(举例try)//不++肯定要出错!也许我这code跟别人不一样,其实//思想都一样,只是具体实现的code有小小的差异罢了 } }else if(next!=father[cur] && dfn[next]<low[cur]) {//呃呃呃!其实不用这个father数组都可以了,只需//dfn[next]<low[cur]就行了 low[cur]=dfn[next]; } }}void solve(){ index=top=cnt_dcc=0; memset(dfn,0,sizeof(dfn));//初始化各下标及dfn DFS_DCC(1);//由于是无向连通图,只需深搜一个节点就都可以都到了}
上面的是求DCC,有时候要求割点,求桥,你根据定义自己想想……都差不来啊!
可能解释的不够清楚,有什么问题?可以问我饿!或者发现有什么不对或不好的地方,欢迎指正!
不过我也只是知道这样实现,并不真正懂得为什么。你如果问我为什么是这样,它的原理是什么?我会给你说:因为只有这样才能实现,它原理就在实现中^_^!如果大虾你理解的深的话……希望能给小弟分享一下!
转载于:https://www.cnblogs.com/fornever/archive/2011/09/17/2179448.html
Tarjan的求双连通分量算法相关推荐
- boost::graph模块实现双连通分量算法的测试程序
boost::graph模块实现双连通分量算法的测试程序 实现功能 C++实现代码 实现功能 boost::graph模块实现双连通分量算法的测试程序 C++实现代码 #include <boo ...
- 图论 —— 图的连通性 —— Tarjan 求双连通分量
[概念] 1.双连通分量:对于一个无向图,其边/点连通度大于1,满足任意两点之间,能通过两条或两条以上没有任何重复边的路到达的图,即删掉任意边/点后,图仍是连通的 2.分类: 1)点双连通图:点连通度 ...
- 【POJ - 3352】Road Construction(Tarjan,边双连通分量)
题干: It's almost summer time, and that means that it's almost summer construction time! This year, th ...
- Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...
转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...
- Redundant Paths POJ - 3177(tarjan+边双连通分量)
题意: 有n个牧场,要求从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新建多少条路,使得任何两个牧场之间至少有两条独立的路.两条独立的路是指:没有公共边的路,但可以经过 ...
- 无向图双连通分量BCC(全网最好理解)
不是标题党,之前我也写过一篇比较全的,但是对于初学者不友好.传送门? 双连通分量(Biconnected component): 1.边双联通 E-BCC 2.点双连通 V-BCC 双 ...
- 强连通分量/点双连通分量/边双联通分量 总结
前言 % 被某brz逼着问,觉得很有必要好好复习一下这 些 毒瘤东西. 定义 % 连通 如果有向图中的两点 uuu,vvv 间同时存在 uuu 到 vvv 的路径及 vvv 到 uuu 的路径,则称点 ...
- 双连通分量(点-双连通分量边-双连通分量)
概念: 双连通分量有点双连通分量和边双连通分量两种.若一个无向图中的去掉任意一个节点(一条边)都不会改变此图的连通性,即不存在割点(桥),则称作点(边)双连通图. 一个无向图中的每一个极大点(边)双连 ...
- POJ - 2942 Knights of the Round Table (双连通分量)
题目链接 题意 有N个骑士,每个骑士有自己不喜欢的人,你需要选择奇数个骑士开一个圆桌会议,每个骑士不能和自己不喜欢的人挨着坐. 问需要删除那些人,这些人不能组成圆桌会议 思路 按照补图建边求双连通分量 ...
最新文章
- android 常见异常解决
- ▲我的css架构理念
- Word Embedding News | 词嵌入新鲜事:COVID-19特刊
- java ldap userpassword 解密_Spring Boot中使用LDAP来统一管理用户信息
- spring使用JdbcTemplate和jdbcDaosupport及具名参数使用
- 【经验分享】工程开发与Coding规范
- clickhouse mysql引擎_ClickHouse为啥能做到变态快,超 MySQL 801倍?
- VB.net SP1 的兼容性问题
- 项目案例模板之登录注册的实现
- bootstrap-table为空_JS组件Bootstrap Table使用方法详解
- Navicat连接CentOS7中的MariaDB
- 辗转相除法 两个数的最大公约数
- Linux RedHat 7 配置本地 YUM源
- 红茶三杯的博客-一个IE的博客
- Flash遮罩之溜光字制作二
- java软件工程师培训学_Java软件工程师学习路线
- sfc/Windows 资源保护找到了损坏文件但无法修复
- [BZOJ2144]跳跳棋
- 09.python常用数据类型—字典
- iis 安装完ssl 证书谷歌浏览器还是提示不安全的解决方法
热门文章
- 【spring boot】新建项目,实现HelloWorld
- linux usb 重启,在ubuntu下重启指定的USB口
- 小狗扫地机器人与石头_当戴森遇到石头机器人,从容应对 “猫狗拆家”
- php有个qrcode类,一个PHP的QRcode类与大家分享
- 软件容量测试和压力测试区别,性能测试、负载测试、压力测试、容量测试的区别...
- matlab充分利用性能,Matlab高性能编程——代码优化和并行计算
- springcloud 返回json
- 四、自然语言处理的主要挑战
- Leetcode惊现马化腾每天刷题?为啥大佬都这么努力?代码你打算写到几岁?
- 20个安全可靠的免费数据源,各领域数据任你挑