tarjan算法(边的双连通分量)
2015-08-09 18:05
183 查看
hiho链接:http://hihocoder.com/contest/hiho53/problem/1
边的双连通分量定义:对于一个无向图的子图,当删除其中任意一条边后,不改变图内点的连通性,这样的子图叫做边的双连通子图。而当子图的边数达到最大时,叫做边的双连通分量。
显而易见的是,这种双连通分量其实就是把原图中的桥给删去后的子图,每一个联通块都是一个双连通分量。。。
边的双连通分量定义:对于一个无向图的子图,当删除其中任意一条边后,不改变图内点的连通性,这样的子图叫做边的双连通子图。而当子图的边数达到最大时,叫做边的双连通分量。
显而易见的是,这种双连通分量其实就是把原图中的桥给删去后的子图,每一个联通块都是一个双连通分量。。。
//找双联通分量跟找割点,割边的tarjan算法基本相似,唯一多出来的即是入栈出栈的过程 //这里的出栈过程中根据当时的题目需要标记了点,出栈具体要做的操作要根据题目来做 //另外cnt_bri一开始的初值是1,不是0 void tarjan(int u) { int v,sum_son = 0; vis[u] = 1; low[u] = dfs_pos[u] = ++jishu; sta[++top] = u;//不断将拜访过的点压入栈 for(int i = head[u];~i;i = e[i].nex) { v = e[i].v; if(!vis[v]) { sum_son++; fa[v] = u; tarjan(v); low[u] = min(low[u],low[v]); if(low[v] > dfs_pos[u]){ cnt_bri++;//双联通分量块的个数,多一个桥即多一个双联通分量 } }else if(v != fa[u]) low[u] = min(low[u],low[v]); } if(dfs_pos[u] == low[u])//当dfs序和low相等时说明当前u在桥的末端,那么栈中的top到u所在的位置的点都在同一个双联通分量中 //下面的代码中不断出栈,一直找到u是重点,其他只是满足题目需要的标记点而已 { int len = 0,minn = u; while(top && sta[top] != u)//出栈这里是重点 { minn = min(minn,sta[top]); fuben[len++] = sta[top]; top--; } top--; mark[u] = minn; for(int i = 0;i < len;i++)mark[fuben[i]] = minn; } }
相关文章推荐
- Eclipse背景设置
- Leetcode: Sqrt(x)
- Nim中文件IO
- 分治算法排序(C++版)
- form表单提交到servlet显示HTTP Status 404错误The requested resource is not available.
- discuz和windPhp的邮件设置
- centos开启防火墙
- [Vijos]P1062 迎春舞会之交谊舞
- [Asp.net]缓存简介
- 函数之间传参,获取别的函数内的变量值
- 操作大文本数据存储在数据库中 mysql中有个lob
- ios 一次性代码的实现
- ITK/VTK对DICOM文件的读取
- android屏幕适配方案
- 枚举
- zoj 3212 K-Nice 解题报告
- 最详细的Log4j使用教程
- Winform开发全套31个UI组件开源共享
- Win10系统的Microsoft Edge浏览器打开任一网页均未响应卡死的问题
- C中预编译详解