【定义】

【强连通分量】

在一个子图中,任意点能够直接或者间接到达这个子图中的任意点,这个子图被称为强连通分量


【解决问题】

求图的强连通分量

同时能够起到

...................缩点

...................求割点

...................求割边

的效果


【算法学习】

首先明确我们的目的,找到强联通分量

所以其实这是一个找环的过程

dfn [] :表示 dfs 序

low [] :表示强联通分量里面 dfs 序最小的 dfs 序

方法如下:

按深度优先遍历所有节点

遍历当前节点的所有出边

  1.如果当前边的中点还没有被访问过,访问

  回溯回来之后比较当前节点的 low 值和终点的 low 值

  将较小的变为当前节点的 low 值

  2.如果访问过,则说明我们绕了一个圈

  则比较当前节点的low值和终点的dfn值,将较小的作为当前结点的low值

当这个节点的dfn值和low值相等的时候,说明这个点是这个强联通分量的终点

在这个栈上面的点和这个点都在同一个强联通分量里面

伪代码如下:

void tarjan(int u)
//当前节点
{dfn[u]=low[u]=++cnt;//先默认该点是一个强联通分量//节点入栈;vis[u]=true;//当前节点已入栈for(遍历该节点所有出边){int v=当前边的终点;if (!dfn[v])//如果没有被遍历过
       {tarjan(v);//深度优先遍历low[u]=min(low[u],low[v]);}else low[u]=min(dfn[v],low[u]);}if (low[u]==dfn[u]){//如果找到了最低的那个节点while(栈顶!=v){染色;出栈;}}染色;出栈;
}        


【模板】

【luogu 2863】

【题目大意】求图内强联通分量内点个数大于1的强连通分量个数

【题目思路】裸的tarjan求强连通分量

再次强调下

分清边的数量和点的数量

分清双向边和单向边

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
const int MAXN = 50010;
struct note
{int nt;int to;
}edge[MAXN];
int top = 0,st[MAXN];
int cnt[MAXN];
int tag[MAXN];
int n, m;
void add(int x, int y)
{top++; edge[top] = { st[x],y }, st[x] = top;
}
stack<int> s;
int  dfn[MAXN], low[MAXN],id,col;
bool vis[MAXN];
void tarjan(int now)
{dfn[now] = low[now] = ++id;vis[now] = true;s.push(now);for (int i = st[now]; i != -1; i = edge[i].nt){int to = edge[i].to;if (!dfn[to]){tarjan(to);low[now] = min(low[now], low[to]);}else{if (vis[to]){low[now] = min(low[now], dfn[to]);}}}if (dfn[now] == low[now]){col++; int t;do {t = s.top();s.pop();tag[t] = col;cnt[col]++;vis[t] = false;} while (t != now);}}
int main()
{scanf("%d%d", &n, &m);memset(st, -1, sizeof(st));for (int i = 1; i <= m; i++){int x, y;scanf("%d%d", &x, &y);add(x, y);}int ans = 0;for (int i = 1; i <= n; i++){if (!tag[i])tarjan(i);}for (int i = 1; i <= col; i++)if (cnt[i] > 1)ans++;printf("%d", ans);return 0;
}

View Code


【扩展】

求割点

求割边


转载于:https://www.cnblogs.com/rentu/p/11331123.html

算法学习:强连通分量 --tarjan相关推荐

  1. 算法提高课-图论-有向图的强连通分量-AcWing 1174. 受欢迎的牛:tarjan算法求强连通分量、tarjan算法板子、强连通图

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 强连通图:给定一张有向图.若对于图中任意两个结点x,y,既存在从x到y的路径,也存在从y到x的路径,则称该有向图是"强连通 ...

  2. 强连通分量(Tarjan算法)和缩点

    强连通分量(Tarjan算法)和缩点 一些定义 给定一张有向图,对于图中任意两个节点 xxx 和 yyy ,存在从 xxx 到 yyy 的路径,也存在从 yyy 到 xxx 的路径,则称该有向图为强连 ...

  3. tarjan算法求解强连通分量问题

    Part1:有向图的强连通分量: 一个连通图只有一个联通分量就是自身,非连通图有多个连通分量. 在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从v ...

  4. 强连通分量(Tarjan算法) 图解

    强连通分量(Tarjan算法) 前言 第一件事:没事不要while(m–),会带来不幸 第二件事:看博客先看看评论,如果博主他写错了的话- 简介 先讲几个定义 强连通:两个顶点 uuu,vvv 可以相 ...

  5. 解题报告:luogu P2341 受欢迎的牛(Tarjan算法,强连通分量判定,缩点,模板)

    题目链接:洛谷 受欢迎的牛 基本上算是一道模板题 根据题意,如果有环,意味着这个环里的牛都互相喜欢 我们可以先求出环,然后把每一个环都看作一个点,这样整个图就变成了一个DAG(有向无环图) 看有几个点 ...

  6. 求无向图的连通分量或有向图的强连通分量—tarjan()ccf高速公路

    概念定义: 在图论中,连通图基于连通的概念. 1. 连通(无向图): 若顶点Vi能通过路径到达Vj,那么称为Vi和Vj是连通的 对无向图:若从顶点Vi到顶点Vj有路径相连(当然从j到i也一定有路径), ...

  7. 算法竞赛——强连通分量

    强连通分量 强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通. 强连通分量(Strongly Connected Components,SCC)的定义是:极大的强连通子图也可以说,在强连 ...

  8. 有向图强连通分量tarjan算法

    转自:http://www.byvoid.com/blog/scc-tarjan/ http://blog.csdn.net/geniusluzh/article/details/6601514 在有 ...

  9. POJ2186——并查集+Tarjan算法求强连通分量

    算法讨论:这题陷阱比较多.首先,被所有牛欢迎,这说明所有的牛都要在一个连通图中,也就是将所给的边看成无向边的时候,所有点要在一个连通图中.这个我们用并查集来实现就可以了.强连通分量的求法就很简单了,正 ...

最新文章

  1. join left 大数据_Java并发编程笔记-JDK内置并行执行框架Fork/Join
  2. linux那点事儿(五)----用户管理常用命令 (转)
  3. Qt坐标系以及自定义可移动控件
  4. FreeSWITCH 总体架构
  5. 西瓜大战java_Java中的线程及(简单飞机大战)实现
  6. android studio 默认继承AppCompatActivity动态设置标题title的方法
  7. [算法]复杂链表的复制
  8. 数据结构之字符串反转
  9. Python:PyCharm选择性忽略PEP8警告
  10. Vue 过滤器filters
  11. 外企的溃败:Oracle中国研发中心裁员,1600人,补偿为N+6
  12. 易班显示服务器错误,重新认识一下,这里是易班
  13. 眼睛又干又痒,到底是干眼症还是结膜炎?
  14. Shadowing Japanese Unit 5
  15. Gamarue僵尸网络
  16. cf----2019-10-28(Sad powers,Zebras,Not simply beatiful strings)
  17. 【PTA】6-4 奇数值结点链表
  18. 安卓优质大作业 前后端 通讯+社区+志愿服务功能
  19. Spring-Cloud-Gateway之代码注入漏洞及解决
  20. 终于等到了,十位Java架构师整理的“阿里P7”养成计划

热门文章

  1. BigDecimal去除末尾多余的0
  2. linux下编译动态和静态链接库
  3. 《Android传感器开发与智能设备案例实战》——第2章,第2.4节安装ADT
  4. bootstrap回顾
  5. Android 进程常驻(0)----MarsDaemon使用说明
  6. Android-ConvenientBanner轻松实现广告头效果
  7. newlisp 接受jenkins带空格的参数
  8. Linux IPC实践(8) --共享内存/内存映射
  9. Python学习入门基础教程(learning Python)--1.4 Python数据处理基础 .
  10. 十进制与二进制间的相互转换