Tarjan 求强连通分量模板、参考博客

#include<stdio.h>
#include<stack>
#include<algorithm>
using namespace std;
;
 + ;
struct EDGE{ int v, nxt; }Edge[maxm];
int Head[maxn], cnt;
int DFN[maxn], LOW[maxn], color[maxn], INDEX, id;
bool vis[maxn];
int N, M;
stack<int> stk;

inline void init()
{
    while(!stk.empty()) stk.pop();
    ; i<=N; i++)
        Head[i] = DFN[i] = LOW[i] = color[i] = -,
    cnt = INDEX = id = ;
}

inline void AddEdge(int from, int to)
{
    Edge[cnt].v = to;
    Edge[cnt].nxt = Head[from];
    Head[from] = cnt++;
}

inline void tarjan(int u)
{
    DFN[u] = LOW[u] = INDEX++;
    stk.push(u);
    vis[u] = true;
    ; i=Edge[i].nxt){
        int Eiv = Edge[i].v;
        ){
            tarjan(Eiv);
            LOW[u] = min(LOW[u], LOW[Eiv]);
        }else{
            if(vis[Eiv])
                LOW[u] = min(LOW[u], LOW[Eiv]);
        }
    }

    if(DFN[u] == LOW[u]){
        color[u] = ++id;
        vis[u] = false;
        while(stk.top() != u){
            vis[stk.top()] = false;
            color[stk.top()] = id;
            stk.pop();
        }
        stk.pop();
    }
}

int main(void)
{
    while(~scanf("%d %d", &N, &M)){
        init();
        int from, to;
        while(M--){
            scanf("%d %d", &from, &to);
            AddEdge(from, to);
        }

        ; i<N; i++)
            )
                tarjan(i);

        printf("%d\n\n", id);
    }
    ;
}

Tarjan 求桥和割点模板

#include<bits/stdc++.h>
using namespace std;
;///图中顶点的数量
;///图中边的数量
struct EDGE{ int v, nxt; }Edge[maxm];
int Head[maxn], cnt;///表头以及边的编号
int LOW[maxn], DFN[maxn];///每个点最早可回溯到的祖先节点、每个点的遍历序号
int Fa[maxn], INDEX;///Fa数组记录每一个点的父亲、INDEX是算法里的时间戳
int N, M;

inline void init()
{
    ; i<=N; i++)
        Head[i] = LOW[i] = DFN[i] = -, Fa[i] = ;
    cnt = INDEX = ;
}

inline void AddEdge(int from, int to)
{
    Edge[cnt].v = to;
    Edge[cnt].nxt = Head[from];
    Head[from] = cnt++;
}

void Tarjan(int v, int Father)
{
    Fa[v] = Father;
    DFN[v] = LOW[v] = INDEX++;
    ; i=Edge[i].nxt){
        int Eiv = Edge[i].v;
        ){
            Tarjan(Eiv, v);
            LOW[v] = min(LOW[v], LOW[Eiv]);
        }
        else if(Father != Eiv)
            LOW[v] = min(LOW[v], DFN[Eiv]);
    }
}

///这份代码中顶点编号是从 0 ~ N-1
void Count()///统计割点和桥
{
    Tarjan(, -);

    ;///割点的数量
    ;///根节点的儿子
    Tarjan(, -);
    ; i<N; i++){
        int v = Fa[i];
        ) Root_Child++;
        else if(LOW[i] >= DFN[v] && !is_cut[v])
            is_cut[v] = true, Cut_Num++;
    }
    )
        is_cut[] = true, Cut_Num++;///根节点有超过一个儿子则说明也是割点

    ; i<N; i++){
        int v = Fa[i];
         && LOW[i] > DFN[v]){
            // v->i is bridge
            //可以用一个 pair<int, int> 来记录
        }
    }
}

int main(void)
{
    while(~scanf("%d %d", &N, &M)){
        init();
        int from, to;
        while(M--){
            scanf("%d %d", &from, &to);
            AddEdge(from, to);
            AddEdge(to, from);
        }
        Count();
    }
    ;
}

Tarjan求强连通分量、求桥和割点模板的更多相关文章

  1. Tarjan求强连通分量,缩点,割点

    Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...

  2. tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  3. tarjan求强连通分量+缩点+割点以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  4. Tarjan算法打包总结(求强连通分量、割点和Tarjan-LCA)

    目录 Tarjan打包总结(求强连通分量.割点和Tarjan-LCA) 强连通分量&缩点 原理 伪代码 板子(C++) 割点 原理 伪代码 最近公共祖先(LCA) 原理 伪代码 板子 Tarj ...

  5. UESTC 901 方老师抢银行 --Tarjan求强连通分量

    思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...

  6. poj 2186 tarjan求强连通分量

    蕾姐讲过的例题..玩了两天后才想起来做 貌似省赛之后确实变得好懒了...再努力两天就可以去北京玩了! 顺便借这个题记录一下求强连通分量的算法 1 只需要一次dfs 依靠stack来实现的tarjan算 ...

  7. [Uva247][Tarjan求强连通分量][Calling Circles]

    题目大意: 例如:A跟B打电话,B跟C打电话,C跟A打电话..D跟E打电话,E跟D不打电话.则A,B,C属于同一个电话圈,D,E分别属于一个电话圈,问有多少个电话圈. 分析 就是裸的求强连通分量,直接 ...

  8. HDU 1827 Summer Holiday(tarjan求强连通分量+缩点构成新图+统计入度+一点贪心思)经典缩点入门题

    Summer Holiday Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  9. CCF 高速公路 tarjan求强连通分量

    问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的 ...

随机推荐

  1. 2019icpc南昌邀请赛F(线段树)

    题目链接:https://nanti.jisuanke.com/t/40258 题意:给长为n的数组a,有m次操作,包括单点修改和查询F(l,r),其值为所有f(i,j)的异或和,l<=i< ...

  2. MYSQL 优化--inner buffer 与关联查询变等值查询

    转自:https://www.2cto.com/database/201312/262376.html 在数据库的应用中,我们经常需要对多表进行连表操作来获得关系型的数据,因此,应该更加的掌握好Mid ...

  3. linux小白家教学<一>

    <数据中心规划与实施> 教学大纲  编写人:Allen 一. 课程教学内容及目标: (一) 知识目标 1.掌握企业级LINUX部署以及相关配置: 2.掌握LINUX操作系统基本的创建.删除 ...

  4. Redis利用Pipeline加速查询速度的方法

    1. RTT Redis 是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下 Redis 客户端执行一条命令分为如下四个过程: 发送命令 命令排队 命令执行 返回结果 客户 ...

  5. java之设计模式汇总

    1.单例模式 就是一个类只产生一个对象 对应数据库连接 定时执行者服务(ScheduledExecutorService) 在整个项目中应该只有一个对象 2.工厂模式 定义一个用于创建对象的接口 让子 ...

  6. 创建node节点的kubeconfig文件

    创建node节点的kubeconfig文件 1.创建TLS Bootstrapping Token export BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | ...

  7. day2-设置position:fixed/absolute无法使用margin:auto调整居中

    问题描述:父元素给定宽度,子元素给定宽度,设置子元素position为absolute/fixed后,无法使用margin:auto使子元素在父元素中水平居中 html代码如下: <div cl ...

  8. Django框架——进阶之AJAX

    <script>$("#b1").on("click", function () { // 点击 id是b1的按钮要做的事儿 var i1 = $( ...

  9. 访问gitlab从http方式改为ssh方式,gitlab使用的不是标准22端口

    设置步骤:1,本地进入.ssh查看是否存在密钥对:xxx和xxx.pub命令:cd ~/.ssh2,如果不存在,使用ssh-keygen来创建命令:ssh-keygen -t rsa -C " ...

  10. Zabbix 3.2.6使用注意事项

    1.如果需要使用zabbix自带的SMTP发送邮件,需要在安装前升级系统的curl到7.20版本以上 2.zabbix对接PHP 7.1版本,因为PHP 7.1类型强化,会在安装完成zabbix,登录 ...