ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

tarjan算法

2021-03-31 11:36:24  阅读:152  来源: 互联网

标签:tarjan int ll stk 算法 dfn low define


  • 每次向下搜点,\(dfn[i]\)表示搜到第\(i\)点时的编号,\(low[i]\)表示第\(i\)个点能到达的最小的点的编号,我们在搜的时候可以把路径上的点存入到栈中,当\(dfn[i]=low[i]\)时,说明我们已经找完一个强连通子图了,此时就可以把栈中的元素出栈得到一个强连通子图.

  • 代码:

    #include <bits/stdc++.h>
    #define ll long long
    #define fi first
    #define se second
    #define pb push_back
    #define me memset
    #define rep(a,b,c) for(int a=b;a<=c;++a)
    #define per(a,b,c) for(int a=b;a>=c;--a)
    const int N = 1e6 + 10;
    const int mod = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    typedef pair<int,int> PII;
    typedef pair<ll,ll> PLL;
    ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
    ll lcm(ll a,ll b) {return a/gcd(a,b)*b;}
     
     int n,m;
     vector<int> edge[N];
     int dfn[N],low[N],timestamp;
     int stk[N],top;
     bool in_stk[N];
     int id[N],scc_cnt;
    
    void tarjan(int u){
        dfn[u]=low[u]=++timestamp;
        stk[++top]=u,in_stk[u]=true;
        for(auto w:edge[u]){
            if(!dfn[w]){
                tarjan(w);
                low[u]=min(low[u],low[w]);
            }
            else if(in_stk[w]) low[u]=min(low[u],dfn[w]);
        }
    
        if(dfn[u]==low[u]){
            ++scc_cnt;
            int y;
            do{
                y=stk[top--];
                in_stk[y]=false;
                id[y]=scc_cnt;
            }while(y!=u);
        }
    }
     
    int main(){
        ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
        cin>>n>>m;
    
        rep(i,1,m){
            int u,v;
            cin>>u>>v;
            edge[u].pb(v);
        }
    
        rep(i,1,n){
            if(!dfn[i]) tarjan(i);
        }
     
        return 0;
    }
    

标签:tarjan,int,ll,stk,算法,dfn,low,define
来源: https://www.cnblogs.com/lr599909928/p/14600608.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有