哎~气死我了!昨天晚上都写好了……一不小心把网页关了,写的全没了……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的求双连通分量算法相关推荐

  1. boost::graph模块实现双连通分量算法的测试程序

    boost::graph模块实现双连通分量算法的测试程序 实现功能 C++实现代码 实现功能 boost::graph模块实现双连通分量算法的测试程序 C++实现代码 #include <boo ...

  2. 图论 —— 图的连通性 —— Tarjan 求双连通分量

    [概念] 1.双连通分量:对于一个无向图,其边/点连通度大于1,满足任意两点之间,能通过两条或两条以上没有任何重复边的路到达的图,即删掉任意边/点后,图仍是连通的 2.分类: 1)点双连通图:点连通度 ...

  3. 【POJ - 3352】Road Construction(Tarjan,边双连通分量)

    题干: It's almost summer time, and that means that it's almost summer construction time! This year, th ...

  4. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

  5. Redundant Paths POJ - 3177(tarjan+边双连通分量)

    题意: 有n个牧场,要求从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新建多少条路,使得任何两个牧场之间至少有两条独立的路.两条独立的路是指:没有公共边的路,但可以经过 ...

  6. 无向图双连通分量BCC(全网最好理解)

    不是标题党,之前我也写过一篇比较全的,但是对于初学者不友好.传送门? 双连通分量(Biconnected component):     1.边双联通 E-BCC     2.点双连通 V-BCC 双 ...

  7. 强连通分量/点双连通分量/边双联通分量 总结

    前言 % 被某brz逼着问,觉得很有必要好好复习一下这 些 毒瘤东西. 定义 % 连通 如果有向图中的两点 uuu,vvv 间同时存在 uuu 到 vvv 的路径及 vvv 到 uuu 的路径,则称点 ...

  8. 双连通分量(点-双连通分量边-双连通分量)

    概念: 双连通分量有点双连通分量和边双连通分量两种.若一个无向图中的去掉任意一个节点(一条边)都不会改变此图的连通性,即不存在割点(桥),则称作点(边)双连通图. 一个无向图中的每一个极大点(边)双连 ...

  9. POJ - 2942 Knights of the Round Table (双连通分量)

    题目链接 题意 有N个骑士,每个骑士有自己不喜欢的人,你需要选择奇数个骑士开一个圆桌会议,每个骑士不能和自己不喜欢的人挨着坐. 问需要删除那些人,这些人不能组成圆桌会议 思路 按照补图建边求双连通分量 ...

最新文章

  1. android 常见异常解决
  2. ▲我的css架构理念
  3. Word Embedding News | 词嵌入新鲜事:COVID-19特刊
  4. java ldap userpassword 解密_Spring Boot中使用LDAP来统一管理用户信息
  5. spring使用JdbcTemplate和jdbcDaosupport及具名参数使用
  6. 【经验分享】工程开发与Coding规范
  7. clickhouse mysql引擎_ClickHouse为啥能做到变态快,超 MySQL 801倍?
  8. VB.net SP1 的兼容性问题
  9. 项目案例模板之登录注册的实现
  10. bootstrap-table为空_JS组件Bootstrap Table使用方法详解
  11. Navicat连接CentOS7中的MariaDB
  12. 辗转相除法 两个数的最大公约数
  13. Linux RedHat 7 配置本地 YUM源
  14. 红茶三杯的博客-一个IE的博客
  15. Flash遮罩之溜光字制作二
  16. java软件工程师培训学_Java软件工程师学习路线
  17. sfc/Windows 资源保护找到了损坏文件但无法修复
  18. [BZOJ2144]跳跳棋
  19. 09.python常用数据类型—字典
  20. iis 安装完ssl 证书谷歌浏览器还是提示不安全的解决方法

热门文章

  1. 【spring boot】新建项目,实现HelloWorld
  2. linux usb 重启,在ubuntu下重启指定的USB口
  3. 小狗扫地机器人与石头_当戴森遇到石头机器人,从容应对 “猫狗拆家”
  4. php有个qrcode类,一个PHP的QRcode类与大家分享
  5. 软件容量测试和压力测试区别,性能测试、负载测试、压力测试、容量测试的区别...
  6. matlab充分利用性能,Matlab高性能编程——代码优化和并行计算
  7. springcloud 返回json
  8. 四、自然语言处理的主要挑战
  9. Leetcode惊现马化腾每天刷题?为啥大佬都这么努力?代码你打算写到几岁?
  10. 20个安全可靠的免费数据源,各领域数据任你挑