Tarjan算法可以用来求一个图中的强连通分量,不仅如此,还可以求图的割边、割点

接下来上一些定义

在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。

下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是两个强连通分量。

[点连通度与边连通度]

在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。一个图的点连通度的定义为,最小割点集合中的顶点数。

类似的,如果有一个边集合,删除这个边集合以后,原图变成多个连通块,就称这个点集为割边集合。一个图的边连通度的定义为,最小割边集合中的边数。

[求割点与桥]

该算法是R.Tarjan发明的。对图深度优先搜索,定义DFS(u)为u在搜索树(以下简称为树)中被遍历到的次序号。定义Low(u)为u或u的子树中能通过非父子边追溯到的最早的节点,即DFS序号最小的节点。根据定义,则有:

Low(u)=Min { DFS(u) DFS(v) (u,v)为后向边(返祖边) 等价于 DFS(v)<DFS(u)且v不为u的父亲节点 Low(v) (u,v)为树枝边(父子边) }

一个顶点u是割点,当且仅当满足(1)或(2) (1) u为树根,且u有多于一个子树。 (2) u不为树根,且满足存在(u,v)为树枝边(或称父子边,即u为v在搜索树中的父亲),使得DFS(u)<=Low(v)。

一条无向边(u,v)是桥,当且仅当(u,v)为树枝边,且满足DFS(u)<Low(v)。

以上十分专业的语言皆为转载,如果对于思路还是不大清楚的安利填坑时看的博客

https://www.byvoid.com/zhs/blog/scc-tarjan

这个是求强连通分量的

https://www.byvoid.com/zhs/blog/biconnect

这个是求割点割边还有一些其他的

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define N 3010
#define M 200010
using namespace std;
int n,m,cnt,g[N],DFN,low[M],dfn[M],cut[N],sz[N];
struct nee{int nxt,to;
}e[M];
inline void tarjan(int x,int f){low[x]=dfn[x]=++DFN;sz[x]=0;for(int i=g[x];i;i=e[i].nxt){++sz[x];if(e[i].to==f) continue;if(dfn[e[i].to])    low[u]=min(low[u],dfn[e[i].to]);else{tarjan(e[i].to,x);low[x]=min(low[x],low[e[i].to]);if(x==1){if(sz[x]>=2) cut[x]=1;}else if(low[e[i].to]>dfn[x]) cut[x]=1;}}
}
inline void addedge(int x,int y){e[++cnt].nxt=g[x];g[x]=cnt;e[cnt].to=y;
}
inline void Jimmy(){scanf("%d%d",&n,&m);for(int i=1,u,v;i<=m;i++){scanf("%d%d",&u,&v);addedge(u,v);}tarjan(1,0);for(int i=1;i<=n;i++)    if(cut[i]) printf("%d\n",i);
}
int main(){Jimmy();return 0;
}

tarjan求割点

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define N 3010
#define M 200010
using namespace std;
int n,m,g[M],cnt,DFN,dfn[M],low[M],cutb;
struct nee{int nxt,to,u,v;
}e[M];
inline addedge(int x,int y){e[++cnt].nxt=g[x];g[x]=cnt;e[cnt].to=y;e[cnt].u=x;e[cnt].v=y;
}
inline void tarjan(int x,int f){low[x]=dfn[x]=++DFN;for(int i=g[x];i;i=e[i].nxt){if(e[i].to==f) continue;if(dfn[e[i].to]) low[x]=min(low[x],dfn[e[i].to]);else {tarjan(e[i].to,x);low[x]=min(low[x],low[e[i].to]);}}
}
inline void Jimmy(){scanf("%d%d",&n,&m);for(int i=1,u,v;i<=m;i++){scanf("%d%d",&u,&v);addedge(u,v);}tarjan(1,0);for(int i=1;i<=m;i++){if(dfn[e[i].u]>dfn[e[i].v]) swap(e[i].u,e[i].v);if(low[e[i].v]>dfn[e[i].u]) ++cutb;}printf("%d\n",cutb);
}
int main(){Jimmy();return 0;
}

tarjan求割边

P.S.:为什么以前博客折叠代码没有标题?因为我今天才发现有这个设置的选项。。。

转载于:https://www.cnblogs.com/JimmyC/p/6636998.html

(填坑)tarjan相关推荐

  1. 【模板篇】splay(填坑)+模板题(普通平衡树)

    划着划着水一不小心NOIP还考的凑合了- 所以退役的打算要稍微搁置一下了- 要准备准备省选了-. 但是自己已经啥也不会了- 所以只能重新拾起来- 从splay开始吧- splay我以前扔了个板子来着, ...

  2. java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得

    该文章出自:http://www.cnblogs.com/hucn/p/3572384.html 分析工具:http://www.blogjava.net/jjshcc/archive/2014/03 ...

  3. 20150726 填坑日记

    三中内填坑: 1. 组合数递推什么的 C(m,n)=C(m,n-1)+C(m-1,n-1).填了个大坑,以前没认真听课QAQ 2. 裸题过河卒 3. 缺角正方形摆放车统计,分上下部分,枚举上部分放几个 ...

  4. 传统行业转型微服务的挖坑与填坑

    原文:传统行业转型微服务的挖坑与填坑 一.微服务落地是一个复杂问题,牵扯到IT架构,应用架构,组织架构多个方面 在多家传统行业的企业走访和落地了微服务之后,发现落地微服务是一个非常复杂的问题,甚至都不 ...

  5. 开发工具总结(4)之Android Studio3.0填坑指南

    序言 Android Studio 3.0 上篇讲了: 全面总结Android Studio2.X的填坑指南 这篇讲一下AS3.0的坑.. 作为这个世界上走在最前沿的生物"猿",怎 ...

  6. 【结果很简单,过程很艰辛】记阿里云Ons消息队列服务.NET接口填坑过程

    Maybe 这个问题很简单,因为解决方法是非常简单,但填坑过程会把人逼疯,在阿里云ONS工作人员.同事和朋友的协助下,经过一天的调试和瞎捣鼓,终于解决了这个坑,把问题记下来,也许更多人在碰到类似问题的 ...

  7. Android Studio 填坑指南

    前几天发布了一篇名为<Android Studio 安装.配置及第一个程序演示>的博文,有不少童鞋都认真阅读过并照步骤一步一步操作了一遍,有滴如期成功地装好了,然鹅有滴反映说这不对呀,为森 ...

  8. 即将上线的Hive服务器面临的一系列填坑笔记

    即将上线的Spark服务器面临的一系列填坑笔记 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.18/10/19 16:36:31 WARN metastore.ObjectSt ...

  9. 第二篇:salt-api使用填坑指南

    前言 salt-api在使用时,有些坑欲哭无泪,一路趟雷过后,总结了一趟salt-pai使用填坑指南,保君一路畅通. salt-api 安装 #本文的安装版本 2018.3.2-1.el6 yum i ...

最新文章

  1. 编写程序实验两个数的加减结果的判断_力学实验1:实验基础与实验仪器
  2. 链接器工具错误 LNK2019 必须在友元声明中显式指定模板参数
  3. C#关键字详解第二节
  4. beyond唱片_如何数字化您的唱片
  5. Madagascar的自定义浮点型函数--三角函数和反三角函数
  6. 基于JAVA+Swing+MYSQL的汽车租赁系统
  7. 个人对stacking的思想理解
  8. JAVA中public protected default private访问权限
  9. Python 2X 版本 痛苦的编码格式,一遍完美解决Unicode、GB2312、GBK编码格式的文章
  10. 数字图像处理MFC程序设计之灰度图像的线性变换
  11. Java面试快问快答-Instrument机制
  12. 2022年2月沪牌拍牌出价策略
  13. JAVA SE基础---kuangstudy
  14. 苹果系统无法购买服务器,itunes目前无法处理您的购买怎么解决
  15. 【简陋Web应用3】实现人脸比对
  16. 全网详解如何设计数据库的ER图,即实体关系图
  17. 最佳实践 | 如何提高落地页的转化率?这里有4个策略
  18. AlexNet论文翻译(中英文对照版)-ImageNet Classification with Deep Convolutional Neural Networks
  19. 商用三相水表行业调研报告 - 市场现状分析与发展前景预测
  20. 无人机专业实训室建设方案

热门文章

  1. 2017HOTELEX Shanghai 3月28日闪亮登场
  2. 迅捷pdf实现多页插入
  3. 2019ICAN总决赛总结
  4. 您的输出设备不支持HDCP
  5. 网站策划与运营关于网站策划
  6. 7位随机数生成-python代码
  7. Android4.1.1,USB存储模式
  8. 百度推出区块链宠物“莱茨狗”
  9. excel简繁切换_Excel2010简繁转换功能没有了怎么处理
  10. NetSuite 创建全局库存关系记录