zoukankan      html  css  js  c++  java
  • 算法竞赛模板 tarjan算法

    tarjan求强连通分量

    #include<bits/stdc++.h> 
    #define MAX 10005 
    using namespace std;  
    int dfn[MAX],low[MAX],inst[MAX],st[MAX],tot,sum,top;
    vector<int>G[MAX];
    void tarjan(int u)
    {
        int v;
        dfn[u]=low[u]=++tot;
        st[++top]=u;
        inst[u]=1;
        for(int i=0;i<G[u].size();i++)
        {
            v=G[u][i];
            if(!dfn[v])
            {
                tarjan(v);
                low[u]=min(low[u],low[v]); //找出父子结点对应关系 
            }
            else if(inst[v])               //如果访问过,并且还在栈里 
                low[u]=min(low[u],dfn[v]); //连接父子结点对应关系 
        }
        if(dfn[u]==low[u])                 //找到强连通分量子树里的最小根 
        {
            sum++;                         //强连通分量个数sum 
            do{
                v=st[top--];
                inst[v]=0;
            }while(u!=v);
        }
    }
    void init()
    {
        for(int i=0;i<MAX;i++)
            G[i].clear();
        top=-1;
        sum=tot=0;
        memset(inst,0,sizeof(inst)); 
        memset(dfn,0,sizeof(dfn)); 
        memset(low,0,sizeof(low));     
    }
    int main()  
    {  
        int n,m,x,y,i;  
        while(cin>>n>>m) 
        {
            init();
            for(i=1;i<=m;i++)  
            {  
                scanf("%d%d",&x,&y);  
                G[x].push_back(y);
            }  
            for(i=1;i<=n;i++) 
                if(!dfn[i])
                    tarjan(i);
        }
        return 0;  
    }
  • 相关阅读:
    自动生成 Makefile 的全过程详解
    cpio实例讲解
    RPM命令手册
    SSHFS
    shell脚本命令行参数传递问题
    批量改名总结
    例解 autoconf 和 automake 生成 Makefile 文件
    Shell中的shift命令
    cpio命令详解
    Git笔记基础
  • 原文地址:https://www.cnblogs.com/kannyi/p/9568918.html
Copyright © 2011-2022 走看看