首页 > 其他分享 >强连通分量,tarjan

强连通分量,tarjan

时间:2023-04-09 22:46:29浏览次数:38  
标签:tarjan int 连通 ins low 分量

强连通:有向图两个点互相可以到达,则称为强连通,强连通分量指将图分成多个子图,每个子图的点都能相互到达,子图就称为强连通分量;

const int N = 1e5 + 5;
vector<int>e[N];
int dfn[N]//dfs顺序
, low[N]//往前跳能到达的最小数
, dex, bel[N]//表示每一个点在哪一个强连通分量中
, cnt;
bool ins[N];//表示是否在栈中
stack<int>s;
vector<vector<int>>scc;
void tarjan(int u) {
    dfn[u] = low[u] = ++dex;
    ins[u] = true;
    s.emplace(u);
    for (int v : e[u]) {
        if (!dfn[v]) 
            tarjan(v);
        if(ins[v])
            low[u] = min(low[u], low[v]);
    }
    if (dfn[u] == low[u])//已经不能往回了
    {
        vector<int>c;
        ++cnt;//连通分量的组数
        while (true) {
            int v = s.top();
            c.emplace_back(v);
            ins[v] = false;
            bel[v] = cnt;
            s.pop();
            if (v == u)
                break;
        }
        sort(c.begin(), c.end());
        scc.emplace_back(c);
    }
}
int mian() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < m; ++i) {
        int u, v;
        cin >> u >> v;
        e[u].emplace_back(v);
    }
    for (int i = 1; i <= n; ++i) {
        if (!dfn[i]) {
            tarjan(i);
        }
    }
    sort(scc.begin(), scc.end());
    for (auto c : scc) {
        for (int u : c) {
            cout << u << ' ';
        }
        cout << endl;
    }
    return 0;
}

 

标签:tarjan,int,连通,ins,low,分量
From: https://www.cnblogs.com/xuanru/p/17301334.html

相关文章

  • Tarjan 算法学习笔记
    (绝大部分都是贺的,来自OI-WIKI和洛谷题解,自己抄一遍印象深刻一点,部分代码未编译,不保证正确性,但大体是对的)一、DFS生成树注意可能有多棵,因为图可能不联通。树边(treeedge):示意图中以黑色边表示,每次搜索找到一个还没有访问过的结点的时候就形成了一条树边。反祖边(backedge):......
  • 837. 连通块中点的数量
    linkcode#include<bits/stdc++.h>usingnamespacestd;constintN=100010;intfa[N],a[N];intcnt[N];intfind(intx){ if(x!=fa[x])fa[x]=find(fa[x]); returnfa[x];}voidun(intx,inty){ x=find(x); y=find(y); if(x!=y){ fa......
  • LightOJ - 1300 Odd Personality(边双连通+奇圈判定)
    题目大意:给出一张无向图,要求找出符合条件的点条件如下:从该点出发,经过一定数量的边,又回到该点,经过的边不能重复经过,且经过的边的数量为奇数解题思路:要回到原点,且不能重复经过边,只能在边双连通分量中找了接着要判断的是有多少个点,只要边双连通分量中有奇圈,那么这个连通分量中的所......
  • 8064: yuyu的虚拟世界 kosaraju强连通分量
    描述 yuyu心情不太好,于是她进入了自己的虚拟世界,其中有n个小镇(1~n编号)和m条单向道,她随便选了一个点,沿着道路往前走,她发现自己可以无限的一直走下去,正好用来打发她的时间。现在她想知道,这个世界中能有几个这样的出发点,只要她选择合适的道路,总可能让她这样一直走下去。  ......
  • 0基础shell脚本ping主机网络连通性实战讲解
    本节通过一个简单脚本,使朋友们了解脚本的基本用法,及编写方法。1、先简化版,实现本机ping主机是否连通,将结果存在一个文件#!/bin/bashifping-c3${i}>/dev/null2>&1th......
  • tarjan缩点(受欢迎的牛)
    #include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>usingnamespacestd;intcnt;//计数intnum;//时间戳intp;//栈的......
  • tarjan割点(备用交换机)
    #include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>usingnamespacestd;intcnt,last[2022],head[2022],next[2022];int......
  • tarjan割边
    #include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>usingnamespacestd;intcnt=1,l[100005],h[100005],nex[100005];i......
  • AtCoder Beginner Contest 248 F(连通性状压dp)
    F连通性状压dp思路看了dls的讲解后才明白一点点。状态\(dp[i][j][k]\)表示到表示到i列,删除了j条边,点i和n-1+i是否联通,对于下一列点,若当前i和n-1+i连通,则多出来的三条......
  • 图的连通性
    无向图的深度优先搜索深度优先搜索的算法过程在图上做DFS时,我们从某个点出发,递归地访问所有与该节点有边相连的节点。在这个过程中,我们用数组vis记录下每个点是否被访问......