(我到底是咕了多少知识点啊)

在有向图中tarjan主要用来求强连通分量并缩点

一、定义

强连通:如果两个顶点可以相互通达,则称两个顶点 强连通

强连通分量:如果有向图G的每两个顶点都 强连通,称G是一个强连通图。非 强连通图有向图的极大强连通子图,称为强连通分量

树枝边:原图上的边中,在DFS树上由⽗亲指向⼉子的叫树枝边

前向边:由父亲指向⼉子以下的其他后代的叫前向边

后向边:由后代指向祖先的边叫后向边

横叉边:一个子树中的点指向另一个子树中的点的边叫横叉边

二、tarjan

用来求强联通分量

基于dfs

每个强连通分量为搜索树中的一颗子树

三、算法

首先要引入两个非常重要的数组:dfn[ ] 和 low[ ]

dfn[ ] :就是一个时间戳(被dfs到的次序)。

low [ ] : 该子树中,且仍在栈中的最小时间戳

这个图不一定是一个连通图,所以跑tarjan的时候要枚举每个点

若dfn[ ] == 0,进行深搜

然后对于搜到的点寻找与其有边相连的点,判断这些点是否已经被搜索过,若没有,则进行搜索。若该点已经入栈,说明形成了环,则更新low.

在不断深搜的过程中如果没有路可走了(出边遍历完了),那么就进行回溯,回溯时不断比较low[ ],去最小的low值。如果dfn[x]==low[x]则x可以看作是某一强连通分量子树的根,也说明找到了一个强连通分量,然后对栈进行弹出操作,直到x被弹出。

洛谷缩点板子题

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;inline int read()
{int sum = 0,p = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-')p = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){(sum *= 10) += ch - '0';ch = getchar();}return sum * p;
}const int maxn = 1e5+1e4,maxm = 1e5 + 1e4;
int vis[maxn],dfn[maxn],low[maxn],tim;
int ncnt,bel[maxn],sum[maxn],f[maxn];
int cnt,head[maxn],nxt[maxm],to[maxm];
int sta[maxn],top;
int n,m,val[maxn],x[maxm],y[maxm],ans;void add(int a,int b)
{nxt[++cnt] = head[a];to[cnt] = b;head[a] = cnt;
}void tarjan(int x)
{dfn[x] = low[x] = ++tim;sta[++top] = x;vis[x] = 1;for(int i = head[x];i;i = nxt[i]){int v = to[i];if(!dfn[v]){tarjan(v);low[x] = min(low[x],low[v]);}else if(vis[v])low[x] = min(low[x],dfn[v]);}if(low[x] == dfn[x]){ncnt++;while(sta[top+1] != x){bel[sta[top]] = ncnt;sum[ncnt] += val[sta[top]];vis[sta[top--]] = 0;}}
}void search(int x)
{if(f[x]) return;f[x] = sum[x];int maxsum = 0;for(int i = head[x];i;i = nxt[i]){if(!f[to[i]])search(to[i]);maxsum = max(maxsum,f[to[i]]);}f[x] += maxsum;
}int main()
{n = read();m = read();for(int i = 1;i <= n;i++)val[i] = read();for(int i = 1;i <= m;i++){x[i] = read();y[i] = read();add(x[i],y[i]);}for(int i = 1;i <= n;i++)if(!dfn[i])tarjan(i);memset(head,0,sizeof(head));memset(nxt,0,sizeof(nxt));memset(to,0,sizeof(to));cnt = 0;for(int i = 1;i <= m;i++){if(bel[x[i]] != bel[y[i]])add(bel[x[i]],bel[y[i]]);}for(int i = 1;i <= ncnt;i++)if(!f[i]){search(i);ans = max(ans,f[i]);}printf("%d",ans);return 0;
} 

转载于:https://www.cnblogs.com/darlingroot/p/11220504.html

Tarjan-有向图相关推荐

  1. Tarjan有向图强连通分量

    Tarjan有向图强连通分量 本文仅供娱乐,不喜勿喷 一.强连通分量 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi ...

  2. *转载 Tarjan有向图详解

    注意! 文章转自:https://www.cnblogs.com/liwenchi/p/7259306.html,如有造成任何侵权行为,请与我联系.我会在第一时间删除. 不过说实话,这大佬写的真的强, ...

  3. 【原创】tarjan算法初步(强连通子图缩点)

    [原创]tarjan算法初步(强连通子图缩点) tarjan算法的思路不是一般的绕!!(不过既然是求强连通子图这样的回路也就可以稍微原谅了..) 但是研究tarjan之前总得知道强连通分量是什么吧.. ...

  4. Kaldi WFST最小化算法

    WFST最小化算法 最小化算法主要是在保证DFA识别的语言不变的条件下,将DFA中等价状态合并,减少状态数.转移边数,简化DFA结构,从而减少存储空间和运算时间.比较有名的最小化算法有Moore,Ho ...

  5. jiedai算法模板合集(正在肝2021.8.15)

    文章目录 基础模板 常用板子 数学题常用板子 输出挂 fread快读 高精度 分数类 打表压缩 基数排序 杂项 数据结构 树状数组 一维树状数组 二维树状数组 线段树 主席树 线段树合并/裂开 吉司机 ...

  6. POJ 2186 popular cow 有向图的强联通问题 Tarjan算法

    参考:http://hi.baidu.com/1093782566/blog/item/e5a0e9229913bd048b82a175.html http://www.cppblog.com/Iro ...

  7. 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...

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

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

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

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

  10. tarjan对有向图的缩点(求强连通分量)

    tarjan对有向图的缩点(求强联通分量) 0x00 tarjan算法简介 tarjan算法是基于DFS的算法,核心在于巧妙的使用访问节点的时间戳 和 栈. tarjan算法可以用于求解: 最近公共祖 ...

最新文章

  1. 微博polg什么意思_贾磊:广东发微博给CBA造成了负面影响 方硕的意思可能没表达清楚...
  2. 深度解析 | 大数据面前,统计学的价值在哪里?
  3. 自动化测试有缺点吗?
  4. Asp.net 2.0 制作复合控件示例(二)[示例代码下载]
  5. 002_html发展史
  6. python爬虫,爬取猫眼电影2(xpath和bs4)
  7. 关于Metasploit开发环境的搭建
  8. python 函数积累
  9. eclipse如何添加Memory Analyzer
  10. C#笔记 使用自定义事件(含参)
  11. 【2016Esri全球用户大会主题亮点】GIS Apps的交响乐
  12. trend函数用oracle实现,使用TREND函数和LINEST函数做销售预测或成本分析
  13. 说一说Qpython3在Android手机上的应用
  14. 大师系列之彼得•林奇层查股
  15. 北卡罗来纳州立大学计算机科学,NCSU的CS「北卡罗来纳州立大学罗利分校计算机科学系」...
  16. 虎胆龙威5java7723,汉米尔顿腕表联手《虎胆龙威5》再度演绎热血豪情
  17. 应用笔记3816 ds 1302 估算涓流充电实时时钟的超级电容备份时间
  18. mysql-5.7 基础篇
  19. 钢材表面缺陷检测分类不同图像增强方式的对比研究
  20. ASCII 碼: 转义字符,正则表达式,特殊字符,模式匹配

热门文章

  1. loadDataWithBaseURL加载HTML数据
  2. python多线程 多进程
  3. Android 音频开发(三) 如何播放一帧音频数据上
  4. 线性表:2.线性表的顺序存储结构--顺序表及C语言实现
  5. python输入三个整数、输出最大的数_题目:使用Python编程,输入三个整数x,y,z,请把这三个数由小到大输出...
  6. 如何做一个国产数据库(三)
  7. c++自由读写配置ifstream(一)
  8. gcc2.95.3安装过程
  9. 60-100-024-使用-MySQL 表锁
  10. 【Flink】FLink 提交报错 instead of minReplication (=1). There are 3 datanode(s) running and 3 node(s) are