// Tarjan算法求有向图强连通分量并缩点
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int N = , M = ;
//
int ver[M], Next[M], head[N], dfn[N], low[N];
int stack[N], ins[N], c[N]; int vc[M], nc[M], hc[N], tc;
//强连通分量
vector<int> scc[N]; int n, m, tot, num, top, cnt; void add(int x, int y) {
ver[++tot] = y, Next[tot] = head[x], head[x] = tot;
}
//缩点后建图
void add_c(int x, int y) {
vc[++tc] = y, nc[tc] = hc[x], hc[x] = tc;
} void tarjan(int x) {
dfn[x] = low[x] = ++num;
stack[++top] = x, ins[x] = ;//标记x点
for (int i = head[x]; i; i = Next[i])
//未走过
if (!dfn[ver[i]]) {
tarjan(ver[i]);
//递归更新
low[x] = min(low[x], low[ver[i]]);
}
else if (ins[ver[i]])
//直接更新
low[x] = min(low[x], dfn[ver[i]]);
if (dfn[x] == low[x]) {
//一个强连通
cnt++; int y;
do {
y = stack[top--], ins[y] = ;
//属于哪一个强连通
c[y] = cnt, scc[cnt].push_back(y);
} while (x != y);
}
} int main() {
cin >> n >> m;
for (int i = ; i <= m; i++) {
int x, y;
scanf("%d%d", &x, &y);
add(x, y);
}
for (int i = ; i <= n; i++)
if (!dfn[i]) tarjan(i);
for (int x = ; x <= n; x++)
for (int i = head[x]; i; i = Next[i]) {
int y = ver[i];
if (c[x] == c[y]) continue;
add_c(c[x], c[y]);
}
}

Tarjan算法求有向图强连通分量并缩点的更多相关文章

  1. Tarjan算法求出强连通分量(包含若干个节点)

    [功能] Tarjan算法的用途之一是,求一个有向图G=(V,E)里极大强连通分量.强连通分量是指有向图G里顶点间能互相到达的子图.而如果一个强连通分量已经没有被其它强通分量完全包含的话,那么这个强连 ...

  2. Tarjan算法 求 有向图的强连通分量

    百度百科 https://baike.baidu.com/item/tarjan%E7%AE%97%E6%B3%95/10687825?fr=aladdin 参考博文 http://blog.csdn ...

  3. Tarjan求有向图强连通分量 BY:优少

    Tarjan算法:一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法. 定义给出之后,让我们进入算法的学习... [情境引入] [HAOI2006受欢迎的牛] 题目描述: 每头 ...

  4. Tarjan算法求有向图的强连通分量

    算法描述 tarjan算法思想:从一个点开始,进行深度优先遍历,同时记录到达该点的时间(dfn记录到达i点的时间),和该点能直接或间接到达的点中的最早的时间(low[i]记录这个值,其中low的初始值 ...

  5. Tarjan 算法求强联通分量

    转载自:http://blog.csdn.net/xinghongduo/article/details/6195337 还是没懂Tarjan算法的原理.但是感觉.讲的很有道理. 说到以Tarjan命 ...

  6. KS求有向图强连通分量模板

    #include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m; ; *maxn; struct no ...

  7. Tarjan算法初探 (1):Tarjan如何求有向图的强连通分量

    在此大概讲一下初学Tarjan算法的领悟( QwQ) Tarjan算法 是图论的非常经典的算法 可以用来寻找有向图中的强连通分量 与此同时也可以通过寻找图中的强连通分量来进行缩点 首先给出强连通分量的 ...

  8. HDU 1269 迷宫城堡 tarjan算法求强连通分量

    基础模板题,应用tarjan算法求有向图的强连通分量,tarjan在此处的实现方法为:使用栈储存已经访问过的点,当访问的点离开dfs的时候,判断这个点的low值是否等于它的出生日期dfn值,如果相等, ...

  9. [Tarjan系列] Tarjan算法与有向图的SCC

    前面的文章介绍了如何用Tarjan算法计算无向图中的e-DCC和v-DCC以及如何缩点. 本篇文章资料参考:李煜东<算法竞赛进阶指南> 这一篇我们讲如何用Tarjan算法求有向图的SCC( ...

随机推荐

  1. FLASH和EEPROM的区别

    FLASH和EEPROM的最大区别是FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低 ...

  2. C++入门经典-例4.11-名称空间的定义和使用

    1:名称空间,也成为名字空间.命名空间,关键字为namespace.我们经常使用这样一条语句: using namespace std: 我们要使用标准输入输出流,除了包含它们所在的头文件外,还必须使 ...

  3. C++入门经典-例2.13-左移运算

    1:代码如下: // 2.13.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using ...

  4. 排序算法(C++)

    冒泡排序.选择排序.快速排序.插入排序.希尔排序.归并排序.基数排序.堆排序. 推荐网址1:https://www.cnblogs.com/onepixel/articles/7674659.html ...

  5. 获取<a>标签值</a>的标签值及更改

    html代码: <a id="catelogue_div1_h5" onclick="catelogue_div1(event)">隐藏</a ...

  6. MongoDB数据库的基本操作命令

    启动服务 net start mongodb 使用 登录本机mongodb Mongodb服务启动之后,打开命令行工具. 登录 mongo 127.0.0.1:27017 27017是mongodb的 ...

  7. Python学习笔记:字典型的数据结构

    根据书上的定义,字典是将数据与键相关联,这个键相当于是一组数据的一个名称,键必须是唯一的. python中提供了内置的映射类型--字典.映射其实就是一组key和value以及之间的映射函数,其特点是: ...

  8. asp.net form submit 在Chrome里面看Form提交

    Chrome中查看 request  form data 在Fiddler中查看

  9. loadrunner事务判断常用方法

    //判断关联到的字符串是否为空 if (strlen(lr_eval_string("{param}")) == 0); //判断关联的字符串是否跟期望的值相同 if(strcmp ...

  10. Kotlin之环境的配置和搭建

    第一步 . 安装和配置JDK http://www.cnblogs.com/loaderman/p/6402948.html 第二步 安装和下载Kotlin 进入Kotlin官网 :https :// ...