• tarjan强连通模板


    #include<stdio.h>//用于求一个图存在多少个强连通分量
    #include<string.h>
    #include<vector>
    using namespace std;
    #define maxn 1000000
    vector<int >mp[maxn];
    int vis[maxn];//标记该点是否被tarjan 
    int dfn[maxn];//时间戳 
    int low[maxn];//low为该点能追溯到的最根的祖先
    int n,m,cnt,sig;
    void init()
    {
        memset(low,0,sizeof(low));
        memset(dfn,0,sizeof(dfn));
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)mp[i].clear();
    }
    void Tarjan(int u)
    {
        vis[u]=1;//标记该点已访问 
        low[u]=dfn[u]=cnt++;//时间戳与low程度初始 
        for(int i=0;i<mp[u].size();i++)
        {
            int v=mp[u][i];
            if(vis[v]==0)Tarjan(v);
            if(vis[v]==1)low[u]=min(low[u],low[v]);//回溯,更新low 
        }
        if(dfn[u]==low[u])//找到一个强连通分量 
        {
            sig++;//强连通分支数 
        }
    }
    void Slove()
    {
        cnt=1;sig=0;
        for(int i=1;i<=n;i++)//对所有未被访问的点tarjan 
        {
            if(vis[i]==0)
            {
                Tarjan(i);
            }
        }
        printf("%d
    ",sig); 
    }
    int main()
    {
        while(~scanf("%d",&n))
        {
            if(n==0)break;
            scanf("%d",&m);
            init();
            for(int i=0;i<m;i++)
            {
                int x,y;
                scanf("%d%d",&x,&y);
                mp[x].push_back(y);
            }
            Slove();
        }
    }
    /*
    7 9
    1 2
    2 3
    3 1
    2 4
    4 7
    7 4				
    4 5
    5 6
    6 4
    8 10
    1 2
    2 3
    3 1
    2 4
    4 7
    7 4
    4 5
    5 6
    6 4
    7 8
    */
    
    /*
    2
    3
    */ 
    
  • 相关阅读:
    java工程师面试总结
    多线程面试题
    冒个泡
    给大家简单介绍一下:Elasticsearch
    单点登录
    (jQuery)Cookie记住用户名和密码
    我们需要循序渐进的代码重构
    Java序列化(Serialization)的理解
    Java对象序列化
    【武】做一个有自控力的人,开始你的时间规划吧!
  • 原文地址:https://www.cnblogs.com/hemeiwolong/p/9022230.html
Copyright © 2020-2023  润新知