刚接触tarjan,tarjan其实更多是用来找强联通分量。我这里呢,是看qsc的视频学的。卿学姐讲的其实很清楚啦。

我这里只是做个整理。

low[]:表示能到达这个点的最小编号。[树枝边]。啊,其实我觉得就是保存环路的起点。QWQ。因为只要记录了这个点,栈中经历的点都能到达嘛都是强联通啊。

dfn[]:搜索到这个点的时间是多少。[后叉边]。时间戳。

vis[]:该点是否进栈。

伪代码如下:

 tarjan(x)
low[x] = dfn[x] = ++index;
stack.push(x);
vis[x] = ;//表示在栈中。
for(v属于E){
if(vis[v] == )
tarjan(v),low[x] = min(low[x],low[v]);
if(vis[v]){
low[x] = min(low[x],dfn[v]);
}
} if(low[x] == dfn[x]){ //这里其实就是表示点已经通过某一种方式到达了自己
做出栈操作
}

这里主要就是在两个if中要理解。

如果该点没有进栈,当前存的当然要是最短的。

如果该点进栈了,就去看他的dfn[]存的是什么,就更新。

具体的举例请看卿学姐的视频啊。QWQ。。有时间我补图上来。。

例题题目链接:NOIP2015信息传递

代码:

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
const int maxn = 2e5+; vector<int> E[maxn];
int dfn[maxn],low[maxn],tot = ,n,ans = maxn;
stack<int> S;
int vis[maxn]; void tarjan(int x){
low[x] = dfn[x] = tot++;
S.push(x);
vis[x] = ;
for(int i = ; i < E[x].size() ;i++){
int v = E[x][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]){
int cnt = ;
while(){
int now = S.top();
S.pop();
vis[x] = ;
cnt++;
if(now == x){
break;
}
}
if(cnt > )
ans = min(ans,cnt);
}
} int main(){
cin>>n;
for(int i = ; i <= n ;i++){
int x;
cin>>x;
E[i].push_back(x);
}
for(int i = ; i <= n ;i++){
if(!dfn[i]){
tarjan(i);
}
} cout<<ans<<endl; return ;
}

【图论】tarjan的更多相关文章

  1. 图论(Tarjan缩点):BZOJ 1194: [HNOI2006]潘多拉的盒子

    1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 344  Solved: 181[Submit][Stat ...

  2. uva 11324 The Largest Clique(图论-tarjan,动态规划)

    Problem B: The Largest Clique Given a directed graph G, consider the following transformation. First ...

  3. HDU 4005 The war (图论-tarjan)

    The war Problem Description In the war, the intelligence about the enemy is very important. Now, our ...

  4. [Usaco2015 Jan]Grass Cownoisseur 图论 tarjan spfa

    先缩点,对于缩点后的DAG,正反跑spfa,枚举每条边进行翻转即可 #include<cstdio> #include<cstring> #include<iostrea ...

  5. ACM(图论)——tarjan算法详解

    ---恢复内容开始--- tarjan算法介绍: 一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法.通过变形,其亦可以求解无向图问题 桥: 割点: 连通分量: 适用问题: 求 ...

  6. Light OJ - 1026 - Critical Links(图论-Tarjan算法求无向图的桥数) - 带详细注释

     原题链接   无向连通图中,如果删除某边后,图变成不连通,则称该边为桥. 也可以先用Tajan()进行dfs算出所有点 的low和dfn值,并记录dfs过程中每个 点的父节点:然后再把所有点遍历一遍 ...

  7. 图论——Tarjan 初步 DFS序+时间戳+欧拉序

    一.什么是DFS序: DFS序是按照先序遍历,先遍历根节点然后依次遍历左子树,右子树的过程,每次遇到新的节点就把新访问节点加到序列中,代码如下: int DFSrk[100000]; int cnt= ...

  8. 【bzoj2140】: 稳定婚姻 图论-tarjan

    [bzoj2140]: 稳定婚姻 哎..都是模板题.. 一眼看过去 哇 二分图哎 然后发现好像并不能匈牙利算法 自己xjb画两张图,发现二分图左向右连配偶的边,然后右向左连交往过的边 然后如果Bi G ...

  9. 洛谷 1262 间谍网络 Tarjan 图论

    洛谷 1262 图论 tarjan 并不感觉把这道题目放在图的遍历中很合适,虽然思路比较简单但是代码还是有点多的,, 将可收买的间谍的cost值设为它的价格,不可购买的设为inf,按照控制关系连图,T ...

  10. gdkoi前的复习

    又浪了一天…… 整理下学的,这两天都温习(预习)一下吧. 27号就是gdkoi了好怕…… 数据结构 ------树 -------------平衡树 -------------线段树/树状数组 --- ...

随机推荐

  1. Linux/UNIX上安装Mysql

    接下来我们在 Centos 系统下使用 yum 命令安装 MySql: 检测系统是否自带安装 mysql: rpm -qa | grep mysql 如果你系统有安装,那可以选择进行卸载: rpm - ...

  2. 使用并行ssh提高工作效率

    我们经常需要ssh到多个主机上执行相同的命令,为了提高效率,我们通常会自己写个脚本,循环遍历执行我们的命令,比如: for host in `cat hosts.txt`;do ssh usernam ...

  3. 20、Linux命令对服务器磁盘进行监控

    服务器磁盘性能测试也是一个比较有意思的过程.首先我们要弄清楚磁盘储存哪些内容,这里推荐鸟哥的私房菜  我们不仅要推算出磁盘什么时候被占满,也要监控磁盘的读写速度.也就是我们常说的 I/O df -h ...

  4. flink中对于window和watermark的一些理解

    package com.chenxiang.flink.demo; import java.io.IOException; import java.net.ServerSocket; import j ...

  5. MFC VC 双缓冲绘图基本原理与实现,详细解释

    转自:http://blog.csdn.net/foreverhuylee/article/details/21548107 当然你可以直接搜索到能用的代码,并且基本能满足要求.不过这样总不是学习的态 ...

  6. JUC源码分析-其它工具类(一)ThreadLocalRandom

    JUC源码分析-其它工具类(一)ThreadLocalRandom ThreadLocalRandom 是 JDK7 在 JUC 包下新增的随机数生成器,它解决了 Random 在多线程下多个线程竞争 ...

  7. 【Python】- scrapy 爬取图片保存到本地、且返回保存路径

    https://blog.csdn.net/xueba8/article/details/81843534

  8. WAMP中的mysql设置密码(默认密码为空)及phpmyadmin的配置

    来自:  http://wenku.baidu.com/link?url=J4K28e1kt-_ykJLsOtS1b5T6hKj5IzL5hXSKIiB133AvPCUXLlxGKScsBsxi0mA ...

  9. 解析TextView中的URL等指定特殊字符串与点击事件

    使用TextView时,有时可能需要给予TextView里的特定字符串,比如URL,数字特别的样式,必希望能够添加点击事件.比如发短信时,文字里的url就可以点击直接打开浏览器,数字可以点击拨打电话. ...

  10. matplotlib.pyplot 属性用法

    import matplotlib.pyplot as plt x_values = list(range(1, 1001)) y_values = [x**2 for x in x_values] ...