tarjan算法
2016-04-13 21:21
106 查看
以下内容为个人理解,有错误地方还请指出。
须知概念:
Dfs搜索树,回边,交叉边(无向图的dfs树不存在交叉边);
dfn[u] :u的dfs序
low[u] :从u或u的子孙出发,通过回边可以到达的最小的dfs序
对于Tarjan算法中,我们得到了dfn和low两个数组,
low[u]:=min(low[u],dfn[v])——(u,v)为回边,v不是u的子树;
low[u]:=min(low[u],low[v])——(u,v)为树枝边,v为u的子树;
下边对其进行讨论:
若low[v]>=dfn[u],则u为割点,u和它的子孙形成一个块。因为这说明u的子孙不能够通过其他边到达u的祖先,这样去掉u之后,图必然分裂为两个子图。
若low[v]>dfn[u],则(u,v)为割边。理由类似于上一种情况。
该算法要求图中不能有重边;
Tarjan 算法的任务就是算出每个点的low值,然后根据图的性质去使用low值。
可以用tarjan算法求解缩点,割点,割边,点双连通分量,边双联通分量,强连通分量等。
例题可参考
/article/8996906.html
http://blog.csdn.net/u013569304/article/details/51146686
须知概念:
Dfs搜索树,回边,交叉边(无向图的dfs树不存在交叉边);
dfn[u] :u的dfs序
low[u] :从u或u的子孙出发,通过回边可以到达的最小的dfs序
对于Tarjan算法中,我们得到了dfn和low两个数组,
low[u]:=min(low[u],dfn[v])——(u,v)为回边,v不是u的子树;
low[u]:=min(low[u],low[v])——(u,v)为树枝边,v为u的子树;
下边对其进行讨论:
若low[v]>=dfn[u],则u为割点,u和它的子孙形成一个块。因为这说明u的子孙不能够通过其他边到达u的祖先,这样去掉u之后,图必然分裂为两个子图。
若low[v]>dfn[u],则(u,v)为割边。理由类似于上一种情况。
该算法要求图中不能有重边;
Tarjan 算法的任务就是算出每个点的low值,然后根据图的性质去使用low值。
可以用tarjan算法求解缩点,割点,割边,点双连通分量,边双联通分量,强连通分量等。
例题可参考
/article/8996906.html
http://blog.csdn.net/u013569304/article/details/51146686
//代码实现 vector<int>head[maxn];//邻接表 tarjan_dfs(int rt,int father)//father为rt的父节点 { int son=0;//rt的子女数 dfn[rt]=low[rt]=dep_tmp++; vis[rt]=true; for(int i=0,len=head[rt].size();i<len;++i) { int v=head[rt][i]; if(!vis[v]) { son++; tarjan_dfs(v,rt); low[rt]=min(low[rt],low[v]); } else if(v!=father)//不要原路返回 { low[rt]=min(low[rt],dfn[v]); } if( (rt!=root && low[v]>=dfn[rt] )|| (rt==root && son>1) ) { cut[rt]=true;//标记割点 } if( low[v]>dfn[rt] { cut_edge[rt][v]=true;//标记割边 cut_edge[v][rt]=true; } } }
相关文章推荐
- IOS UIPanGestureRecognizer 移动图片
- 百度分享——1
- 【c语言】将二进制整数转换为字符
- HttpURLConnection中使用代理(Proxy)及其验证(Authentication)
- hdu2058java
- 一个序列的扩展函数的帮助类
- 关于信号三种处理方式初步理解!
- UncaughtExceptionHandler捕获程序异常退出并做相应操作
- 算法学习(三)字符串查找,删除,复制strstr/strcpy/strpbrk等库函数
- 访问单个节点的删除
- (转)内置系统账户:Local system/Network service/Local Service 区别
- 欢迎使用CSDN-markdown编辑器
- centos配置IP并远程登录
- (10)Java设计模式-桥接模式(Bridge)
- 欢迎使用CSDN-markdown编辑器
- maven的scm插件介绍及使用示例
- Java之——Java mail邮件开发实战
- 【c语言】用迭代计算斐波那契数
- Android多线程断点续传下载
- HDU 5057-平方分割(分块)