转自: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算法的更多相关文章

  1. poj-3177(并查集+双联通分量+Tarjan算法)

    题目链接:传送门 思路: 题目要将使每一对草场之间都有至少两条相互分离的路径,所以转化为(一个有桥的连通图至少加几条边才能变为双联通图?) 先求出所有的桥的个数,同时将不同区块收缩成一个点(利用并查集 ...

  2. HDU4612(Warm up)2013多校2-图的边双连通问题(Tarjan算法+树形DP)

    /** 题目大意: 给你一个无向连通图,问加上一条边后得到的图的最少的割边数; 算法思想: 图的边双连通Tarjan算法+树形DP; 即通过Tarjan算法对边双连通缩图,构成一棵树,然后用树形DP求 ...

  3. 强联通块tarjan算法

    http://poj.org/problem?id=1236第一问:需要几个学校存在软件,才能通过传递,使得所有的学校都有软件 用tarjan算法求出强联通分量后,将每个联通分量缩成一个点,那么问题1 ...

  4. 强联通分量-tarjan算法

    定义:在一张有向图中,两个点可以相互到达,则称这两个点强连通:一张有向图上任意两个点可以相互到达,则称这张图为强连通图:非强连通图有极大的强连通子图,成为强联通分量. 如图,{1},{6}分别是一个强 ...

  5. 无向图边双联通分量 tarjan 模板

    #include <bits/stdc++.h> using namespace std; const int MAXN = 100005; const int MAXM = 500005 ...

  6. Codeforces 732F [边双联通分量][tarjan]

    /* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给一个无向图.现在要求给这个无向图的边加上方向. 定义f(x)为从x点出发能够到达的点的数目. 使得MIN(f(x))最大. 思路: 先tarja ...

  7. 有向图的强联通分量 Tarjan算法模板

    //白书 321页 #include<iostream> #include<cstdio> #include<cstring> #include<vector ...

  8. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

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

    Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...

随机推荐

  1. 如何开启spring框架以注解形式的配置

    步骤 导包(新版本需要导入spring-aop-4.3.17.RELEASE.jar) 为配置文件applicationContext.xml引入新的命名空间(约束) 开启使用注解 <?xml ...

  2. Install packages failed: Installing packages: error occurred. ------简单的问题常常会被忽略

    用 pip install 安装了wxpy这个库,但是使用的时候却报错:ImportError: No module named wxpy 我先用 pip list 查看了一下,发现这个库是已经存在的 ...

  3. 英语单词substitution

    substitution 来源——shell字符串切片 [root@centos73 ~]# echo ${$alpha:3:4} -bash: ${$alpha:3:4}: bad substitu ...

  4. 本地develop往远端develop上推代码步骤

  5. PCB六层板学习(一)

    一.原理图的网表导出及版本转换 安装Cadence后,打开RK3288的原理图. 首先点击rk3288-mid.dsn >> 然后有一个Create netlist的图标(当然咋Tools ...

  6. Java和Tomcat的关系 Java如何发布web服务

    https://blog.csdn.net/qq_31301961/article/details/80732669 除了Tomcat还有WebLogic 大型分布式的 如何部署映射 Tomcat使用 ...

  7. UOJ 418 【集训队作业2018】三角形——思路+线段树合并

    题目:http://uoj.ac/problem/418 看了题解才会…… 很好的想法是把整个过程看成若干 “取一点 i ,值+=w[ i ],值-=\(\sum w[j]\)”(其中 j 是 i 的 ...

  8. [CSU1806]Toll

    题目:Toll 传送门:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1806 题目简述:给定n个点m条有向边的有向图,每条边的花费是$b_i ...

  9. 一双木棋(chess)

    一双木棋(chess) 题目描述 菲菲和牛牛在一块 nn 行 mm 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束.落子的规 ...

  10. U-Boot是什么

    U-Boot U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目.U-Boot的作用是系统引导.U-Boot从FADSROM.8xxROM.PPCBOOT逐 ...