Tarjan

0.2

目录

  • Tarjan

    • 基本概念
    • 基础代码
    • 常见变换

基本概念

    Tarjan是一种求有向图强联通分量的算法, 是用dfs实现以及时间戳标记访问最短时间的.Tarjan算法中每个点都需要扩展边,为了存储方便,推荐使用邻接表.Tarjan算法的优势在于其灵活性,基础代码可以直接适用于多数情况.常见于dfs序.

运行Tarjan算法的过程中,每个顶点都被访问了一次,且只进结合.出了一次堆栈,每条边也只被访问了一次,所以该算法的时间复杂度为O(N+M)。


基础代码

#include <cstdio>
#include <stack>
#include <iostream>
using namespace std;
int f[11],ro,dfn[11],low[11],g[11],c;
bool v[11];
stack<int> q;
struct $
{int s,t,ne;
}a[11];
void Tarjan(int co)
{/*dfn层数low最早到达时间*/dfn[co]=low[co]=++c;//标记当前时间戳q.push(co);//将点压入栈for(int k=f[co];k;k=a[k].ne){int i=a[k].t;if(v[i]) continue;//如果已经访问过,就跳过//dfsif(!dfn[i])//这个表示该点是否已经被打上时间戳{Tarjan(i);low[co]=min(low[co],low[i]);//如果否,打上最小时间戳.}elselow[co]=min(low[co],dfn[i]);}if(dfn[co]==low[co])//找到根{sum++;//记录分量数量int i;while(i!=co){i=q.top();v[i]=true;//标记找到g[i]=co;//记录每个点的根,在缩图时用q.pop();}v[co]=1;if(!q.empty())q.pop();//有些特殊情况不判断可能会崩溃}
}
int main()
{int n;cin>>n;for(int i=1;i<=n;i++)//链式前向星while(1){scanf("%d",&v);if(!v) break;a[++ro].s=i;a[ro].t=v;a[ro].ne=f[i];f[i]=v;}for(int i=1;i<=n;i++)//扩展if(!dfn[i]){c=0;Tarjan(i);}return 0;
}

常见变换

(main())
if(c==1)//c标记强联通分量数量printf("该图强联通\n");void rebuild()//缩图去环
{for(int i=1;i<=ro/*路的数量*/;i++)if(g[a[i].s]!=g[a[i].t])//如果路的两端分别在两个强联通分量中合并;}
void degree()//入度出度计算,紧接rebuild()
{int ina=0,outa=0,vi[11]={0},vo[11]={0};//标记点是否有出入度,可根据需要改为计数for(int i=1;i<=ro)if(g[a[i].s]!=g[a[i].t]){//在这里改为++即可vi[a[i].t]=1;vo[a[i].s]=1;}for(int i=1;i<=n;i++){if(!vi[i]) ina++;if(!vo[i]) outa++;}
}

Tarjan 0.2相关推荐

  1. 《算法竞赛进阶指南》tarjan做法 银河

    银河中的恒星浩如烟海,但是我们只关注那些最亮的恒星. 我们用一个正整数来表示恒星的亮度,数值越大则恒星就越亮,恒星的亮度最暗是 1. 现在对于 N 颗我们关注的恒星,有 M 对亮度之间的相对关系已经判 ...

  2. bzoj 2330 / AcWing 368 银河 差分约束系统+tarjan缩点+拓扑排序

    怎么最近bzoj一直上不了,莫非是挂了? AcWing的地址:https://www.acwing.com/problem/content/370/ 题意: 银河中的恒星浩如烟海,但是我们只关注那些最 ...

  3. 超详细Tarjan算法总结,求强连通分量,割点,割边,有重边的割边

    Tarjan是一个人,他一身中发明了很多算法,就这几个算法最为出名. 1.求有向图的强连通分量,那么什么是强连通分量呢,就是一个顶点集合,任意两个顶点间都可以互相到达.一个顶点也是强联通分量如果图中任 ...

  4. Tarjan(塔杨)算法详解

    Tarjan算法详解 前言 简介 教学代码-有向图的强联通分量 教学代码-点双联通分量 教学代码-边双联通分量 实战代码-边双 实战代码-点双 前言 Tarjan(塔杨)算法其实不是很复杂,对于图这一 ...

  5. 估算带卷积核二分类0,3的网络的收敛时间和迭代次数

    制作一个网络分类minst的0和3求出这网络的迭代次数曲线表达式n(δ),和准确率表达式p-max(δ),用预期准确率去估算n,并推算需要的时间. 将minst的28*28的图片缩小到9*9,网络用一 ...

  6. 【图论专题】有向图的强连通分量

    整理的算法模板合集: ACM模板 题目列表: 题目 算法 A.AcWing 1174. 受欢迎的牛 缩点 B.AcWing 367. 学校网络 缩点 C.AcWing 1175. 最大半连通子图 ta ...

  7. 【图论技巧】点边转化(拆点和拆边)

    目录 一.总述 二.常见的有针对性的算法 - 针对点权 - 针对边权 三.拆点 - 过程 - 实例 - 网络流 四.拆边 - 过程 - 实例 - 倍增算法(Kruskal 重构树) - LCT 维护最 ...

  8. Jzoj4729 道路修建

    给你一个联通无向图,问你要修建几条边使得该图是一个边双连通图 无比经典,肯定是一个tarjan求桥,删掉后缩点,变成一颗树,看看有几个叶子结点,叶子结点一对对连起来即可 #include<std ...

  9. Codeforces Gym101257F:Islands II(求割点+思维)

    http://codeforces.com/gym/101257/problem/F 题意:给出一个n*m的地图,上面相同数字的代表一个国家,问对于每个国家有多少个国家在它内部(即被包围).例如第一个 ...

最新文章

  1. 有理有据:一篇来自前端同学对后端接口的吐槽!
  2. 计算机编程语言python-2018年计算机编程语言排名: Python语言排名第一
  3. 【转】修改版WinXP集体歇业避免遭遇调查
  4. Hadoop配置学习
  5. winform执行oracle语句,C#中的Winform应用程序连接远程Oracle数据库的配置文件及SQL语句的写法...
  6. 在metasploitable里面搭建ZVulDrill
  7. Struts2之国际化
  8. 小程序的1024KB
  9. 如何设置 IDEA炫酷主题样式
  10. 在 React 中构建一个可拖动的滑块
  11. C语言求x个电阻并联的和的程序,C语言 计算并联电阻的阻值
  12. 【手游】手游行业专业相关知识储备
  13. 复习jquery菜鸟教程
  14. 面试记录:光大银行北京分行金融科技岗实习
  15. Typora、Markdown中的公式,颜色汇总
  16. Neural Network, CNN 简介
  17. GAMLSS代码示例
  18. 1076 Forwards on Weibo (30 分)
  19. JDK内置工具之appletviewer
  20. I2C通信协议:了解I2C Primer、PMBus和SMBus

热门文章

  1. 2022工具钳工(初级)考试练习题模拟考试平台操作
  2. Axure制作ipad原型
  3. 机器学习——基于Bagging的集成学习:随机森林(Random Forest)及python实现
  4. 华为搜索引擎面世:用不了谷歌,试试“花瓣搜索”?
  5. IDea项目名修改后,后面有个中括号原来的项目名
  6. 用java代码实现 PDF转其他文件功能,请为每一行代码进行注释
  7. 初探苹果AppStore搜索指数及其含义,aso的搜索指数
  8. 从简历被拒,到斩获蚂蚁offer,这几个公众号资源功不可没
  9. Vue.Draggable使用
  10. 《花束般的恋爱》:用力绽放却注定凋零