双联通的tarjan算法
转自:https://www.zhihu.com/question/40746887/answer/88428236
连通分量有三种∶边双连通分量,点双连通分量,强连通分量,前两种属于无向图,后一种属于有向图
定义:
双连通分量又分双连通分量和边双连通分量两种。若一个无向图中的去掉任意一个节点(一条边)都不会改变此图的连通性,即不存在割点(桥),则称作点(边)双连通图。一个无向图中的每一个极大点(边)双连通子图称作此无向图的点(边)双连通分量。
代码如下:
点双联通
struct Edge{
int u,v;
Edge(int _u,int _v):u(_u),v(_v){}
}edge[maxn];
int dfn[maxn],low[maxn],cut[maxn],bccno[maxn];
vector<int>gra[maxn],bcc[maxn];
stack<int>stk;
int cnt,bcnt; void tarjan(int f,int u){
dfn[u]=low[u]=++cnt;
int child=0;
int sz=gra[u].size();
for(int i=0;i<sz;i++){
int id=gra[u][i];
int v=edge[id].v;
if(!dfn[v]){
stk.push(id);
child++;
tarjan(u,v);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]){
cut[u]=1;
bcc[++bcnt].clear();
while(1){
int id=stk.top();
stk.pop();
int uu=edge[id].u;
int vv=edge[id].v;
if(bccno[uu]!=bcnt){
bcc[bcnt].push_back(uu);
bccno[uu]=bcnt;
}
if(bccno[vv]!=bcnt){
bcc[bcnt].push_back(vv);
bccno[vv]=bcnt;
}
if(uu==u&&vv==v){
break;
}
}
}
}else if(dfn[v]<dfn[u]&&v!=f){
stk.push(id);
low[u]=min(low[u],dfn[v]);
}
}
if(f<0&&child==1){
cut[u]=0;
}
}
边双联通
struct Edge{
int u,v;
Edge(int _u,int _v):u(_u),v(_v){}
}edge[maxn];
int dfn[maxn],low[maxn],bccno[maxn];
vector<int>gra[maxn],bcc[maxn];
bool isb[maxn];
void tarjan(int f,int u){
dfn[u]=low[u]=++cnt;
int sz=gra[u].size();
for(int i=0;i<sz;i++){
int id=gra[u][i];
int v=edge[id].v;
if(!dfn[v]){
tarjan(u,v);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]){
isb[id]=isb[id^1]=1;
}
}else if(dfn[v]<dfn[u]&&v!=f){
low[u]=min(low[u],dfn[v]);
}
}
}
void dfs(int u){
dfn[u]=1;
bccno[u]=bcnt;
int sz=gra[u].size();
for(int i=0;i<sz;i++){
int id=gra[u][i];
int v=edge[id].v;
if(isb[id]){
continue;
}
if(!dfn[v]){
dfs(v);
}
}
}
int main(){
for(int i=1;i<=n;i++){
if(!dfn[i]){
tarjan(-1,i);
}
}
memset(dfn,0,sizeof(dfn));
for(int i=1;i<=n;i++){
if(!dfn[i]){
bcnt++;
dfs(i);
}
}
}
双联通的tarjan算法的更多相关文章
- poj-3177(并查集+双联通分量+Tarjan算法)
题目链接:传送门 思路: 题目要将使每一对草场之间都有至少两条相互分离的路径,所以转化为(一个有桥的连通图至少加几条边才能变为双联通图?) 先求出所有的桥的个数,同时将不同区块收缩成一个点(利用并查集 ...
- HDU4612(Warm up)2013多校2-图的边双连通问题(Tarjan算法+树形DP)
/** 题目大意: 给你一个无向连通图,问加上一条边后得到的图的最少的割边数; 算法思想: 图的边双连通Tarjan算法+树形DP; 即通过Tarjan算法对边双连通缩图,构成一棵树,然后用树形DP求 ...
- 强联通块tarjan算法
http://poj.org/problem?id=1236第一问:需要几个学校存在软件,才能通过传递,使得所有的学校都有软件 用tarjan算法求出强联通分量后,将每个联通分量缩成一个点,那么问题1 ...
- 强联通分量-tarjan算法
定义:在一张有向图中,两个点可以相互到达,则称这两个点强连通:一张有向图上任意两个点可以相互到达,则称这张图为强连通图:非强连通图有极大的强连通子图,成为强联通分量. 如图,{1},{6}分别是一个强 ...
- 无向图边双联通分量 tarjan 模板
#include <bits/stdc++.h> using namespace std; const int MAXN = 100005; const int MAXM = 500005 ...
- Codeforces 732F [边双联通分量][tarjan]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给一个无向图.现在要求给这个无向图的边加上方向. 定义f(x)为从x点出发能够到达的点的数目. 使得MIN(f(x))最大. 思路: 先tarja ...
- 有向图的强联通分量 Tarjan算法模板
//白书 321页 #include<iostream> #include<cstdio> #include<cstring> #include<vector ...
- 『Tarjan算法 无向图的双联通分量』
无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...
- Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)
Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...
随机推荐
- Appium API文档中文版
传送门 https://testerhome.com/topics/3144
- leetcode-167周赛-1291-顺次数
题目描述: 自己的提交: class Solution: def sequentialDigits(self, low: int, high: int) -> List[int]: l,h = ...
- spring-boot整合mybaits多数据源动态切换案例
1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springBo ...
- JS中的getter和setter
对象有两种属性:(1)数据属性,就是我们经常使用的属性(2)访问器属性,也称存取器属性 存取器属性就是一组获取和设置值的函数.getter负责获取值,它不带任何参数.setter负责设置值,在它的函数 ...
- spring+cxf
里面有http://127.0.0.1:8081/dcs/soap/cls http://127.0.0.1:8081/dcs/soap/cms http://127.0.0. ...
- LUOGU P4088 [USACO18FEB]Slingshot(线段树)
传送门 解题思路 推了推式子发现是个二维数点,想了想似乎排序加线段树难写,就写了个树套树,结果写完看见空间才\(128M\)..各种奇技淫巧卡空间还是\(MLE\)到天上.后来只好乖乖的写排序+线段树 ...
- GPIO 的 8 种工作模式
GPIO 的 8 种工作模式 在初始化 GPIO 的时候,根据我们的使用要求,必须把 GPIO 设置为相应的模式.如 LED 例程中的 GPIO 引脚如果配置为模拟输入模式是必然会导致错误的. 我们配 ...
- 【转】如何成功安装旧版本火狐,成功安装firebug和firepath插件
原文地址:https://www.cnblogs.com/meimei00/p/10566793.html
- xstart使用方法
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/YABIGNSHI/article/det ...
- play framework 在idea简单运行配置(mac为例)
文章目录 play 最基本的构建 在idea中配置 配置jdk相关 配置play 运行 运行 play 最基本的构建 https://blog.csdn.net/dataiyangu/article/ ...