tarjan 缩点 + 几道例题

tarjan 模板

#include <iostream>
#include <string.h>
using namespace std;
const int MAX_N = 100;
const int MAX_M = 10000; struct edge{
int v,next;
int len;
}E[MAX_M]; int p[MAX_N],eid;
int dfn[MAX_N],low[MAX_N];
int idx = 0;
int belong[MAX_N],scc = 0;
int s[MAX_N],top = 0;
bool in_stack[MAX_N]; void init(){
memset(p,-1,sizeof(p));
eid = 0;
} void insert(int u,int v){
E[eid].v = v;
E[eid].next = p[u];
p[u] = eid++;
} void tarjan(int u){
dfn[u] = low[u] = ++idx;
s[top++] = u;
in_stack[u] = true;
for(int i=p[u];i+1;i=E[i].next){
int v = E[i].v;
if(!dfn[v]){
tarjan(v);
low[u] = min(low[u],low[v]);
}else if(in_stack[v]){
low[u] = min(low[u],dfn[v]);
}
}
if(dfn[u] == low[u]){
++scc;
do{
belong[s[--top]] = scc;
in_stack[s[top]] = false;
}while(s[top] != u);
}
} int main() {
int n,m;
init();
cin>>n>>m;
for(int i=0;i<m;i++){
int u,v;
cin>>u>>v;
insert(u,v);
}
memset(dfn,0,sizeof(dfn));
idx = 0;
for(int i=1;i<=n;i++){
if(!dfn[i]){
tarjan(i);
}
}
for(int i=1;i<=scc;i++){
cout<<"block "<<i<<": ";
for(int j=1;j<=n;j++){
if(belong[j] == i){
cout<<j<<" ";
}
}
cout<<endl;
}
return 0;
}

例题1:受欢迎的蒜头





题解地址:https://blog.csdn.net/qq_29980371/article/details/77963431

例题2:发现环(蓝桥杯第八届国赛)

题解地址:https://blog.csdn.net/cillyb/article/details/72802229

例题3:河南省第十二届ACM省赛

G题:tarjan缩点,求出强连通分量数量,统计入度为0的点,但是这样做的人都wa了。。暂且先放在这篇博文里,等时机成熟再补题。

例题4:noip2015信息传递

tarjan找最小环

https://www.luogu.org/problemnew/solution/P2661?page=2

更多:https://www.cnblogs.com/stxy-ferryman/p/7779347.html

求割点和桥:https://www.cnblogs.com/geloutingyu/p/6758624.html

求割点和桥:https://www.jianshu.com/p/d765427e07df

加上两句话:

if(dfn[u] <= low[v]) f = true;

if((!fa && son>1) || (fa && f)) cutp.push_back(u);

vector <int>  cutp;//存放割点
void dfs(int u, int fa){
dfn[u] = low[u] = ++timer;
int son = 0;
bool f = false;
for(int i=0;i<E[u].size();i++){
int v = E[u][i];
if(v == fa) continue;
if(!dfn[v]){
son++;
dfs(v, u);
if(dfn[u] <= low[v]) f = true;
low[u] = min(low[u], low[v]);
}
else low[u] = min(low[u], dfn[v]);
}
if((!fa && son>1) || (fa && f)) cutp.push_back(u);
}

tarjan 缩点 + 几道例题的更多相关文章

  1. 初涉tarjan缩点

    tarjan缩点:口胡过好多题,不过从来没写过…… 什么是缩点 tarjan和Kosaraju.Gabow算法一样,是为了求有向图中的强连通分量.因为有向图中大多数情况下会有环存在,而有环是一个不甚好 ...

  2. 强连通分量tarjan缩点——POJ2186 Popular Cows

    这里的Tarjan是基于DFS,用于求有向图的强联通分量. 运用了一个点dfn时间戳和low的关系巧妙地判断出一个强联通分量,从而实现一次DFS即可求出所有的强联通分量. §有向图中, u可达v不一定 ...

  3. 【bzoj1179】[Apio2009]Atm Tarjan缩点+Spfa最长路

    题目描述 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每 ...

  4. Tarjan缩点+Spfa最长路【p3627】[APIO2009] 抢掠计划

    Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri ...

  5. tarjan 缩点 求 scc

    算法学自 BYVoid https://www.byvoid.com/zhs/blog/scc-tarjan/ 这个写得很清楚了 当然 你可能不这么认为 而且 如果是让我 一开始就从这个博客 学 ta ...

  6. 20190716NOIP模拟赛T2 通讯(tarjan缩点+贪心)

    题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术,SERN总部 ...

  7. 洛谷 P3627 [APIO2009]抢掠计划 Tarjan缩点+Spfa求最长路

    题目地址:https://www.luogu.com.cn/problem/P3627 第一次寒假训练的结测题,思路本身不难,但对于我这个码力蒟蒻来说实现难度不小-考试时肛了将近两个半小时才刚肛出来. ...

  8. hihoCoder 1185 连通性·三(Tarjan缩点+暴力DFS)

    #1185 : 连通性·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 暑假到了!!小Hi和小Ho为了体验生活,来到了住在大草原的约翰家.今天一大早,约翰因为有事要出 ...

  9. POJ 1236 Network of Schools(Tarjan缩点)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16806   Accepted: 66 ...

随机推荐

  1. Recover With Until Time fails With RMAN-20207 When Time Is Before Last RESETLOGS (Doc ID 159405.1)

    Recover With Until Time fails With RMAN-20207 When Time Is Before Last RESETLOGS (Doc ID 159405.1) A ...

  2. NXP_RTCESL库

    恩智浦实时控制嵌入式软件库(缩写为RTCESL,以前为恩智浦嵌入式软件库FSLESL)是一组算法,从基础数学运算到高级数学变换以及高级观测器,这些都可以方便地用在复杂的实时控制应用中以及我们的电机控制 ...

  3. Python函数名做参数,闭包,装饰器

    简单讲解闭包的写法和应用,在这之前,先声明,你定义的任意一个函数都可以作为其他函数的参数.就像下面这段代码的参数func,接收的参数就是一个函数名,在函数体内部使用了func()调用执行函数. 请看下 ...

  4. 手机号码生成器app,手机上用的

    手机号码生成器app,在日常的工作中可能会用到,它是用来找客人用的,不是生成了拿来做手机卡使用的,可能很多人会误解他的功能. 其实他的操作并不复杂,大体分为三步. 第一步,选择省份城市比如我们选择了甘 ...

  5. MVC(基础二)

    原文链接:https://blog.csdn.net/wuzxc520/article/details/77880783 1.网站开发介绍 2.响应流程 3.MVC 介绍 4.文件夹含义

  6. flask之web网关、三件套、配置、路由(参数、转化器及自定义转化器)、cbv、模板语言、session

    目录 1.wsgiref.py 2.werzeug.py 3.三件套 4.配置文件 5.路由本质 6.cbv.py 7.路由转化器 8.自定义转化器 9.模板语言 10.session原理 11.te ...

  7. pytroch中cp27m和cp27mu的区别及判别方法

    python中m和mu的区别 从https://download.pytorch.org/whl中下载pytorch安装包时常会发现有相同版本的安装包有cp27m和cp27mu两种,其中cp27m是u ...

  8. 可迭代对象(__iter__()和__next__())

    如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()和__next__()方法,该方法返回一个迭代对象 然后,Python的for循环就会不断调 ...

  9. IT兄弟连 Java语法教程 流程控制语句 分支结构语句2

    2  if-else条件语句 if-else语句的完整形式如下: if(判断条件){ A代码块(判断条件的值为true,执行) }else{ B代码块(判断条件的值为false,执行) } 当然,如果 ...

  10. 【Linux】Linux 性能瓶颈阈值分析

    Linux系统资源包括:CPU.IO(磁盘和网络).内存等 利用率达到三个阶段时: 1)50% 引起注意 2)70% 密切关注 3)90% 严重情况 vmstat.sar.iostat.mpstat. ...