• HDU


    d.看一个图是不是强连通图

    s.求出强连通分量,看看有没有一个强连通分量包含所有点。

    c.Tarjan

    /*
    Tarjan算法
    复杂度O(N+M)
    */
    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    
    const int MAXN=10010;//点数
    const int MAXM=100010;//边数
    struct Edge{
        int to,next;
    }edge[MAXM];
    int head[MAXN],tot;
    int Low[MAXN],DFN[MAXN],Stack[MAXN],Belong[MAXN];//Belong数组的值是1~scc
    int Index,top;
    int scc;//强连通分量的个数
    bool Instack[MAXN];
    int num[MAXN];//各个强连通分量包含点的个数,数组编号1~scc
    //num数组不一定需要,结合实际情况
    
    void addedge(int u,int v){
        edge[tot].to=v;
        edge[tot].next=head[u];
        head[u]=tot++;
    }
    void Tarjan(int u){
        int v;
        Low[u]=DFN[u]=++Index;
        Stack[top++]=u;
        Instack[u]=true;
        for(int i=head[u];i!=-1;i=edge[i].next){
            v=edge[i].to;
            if(!DFN[v]){
                Tarjan(v);
                if(Low[u]>Low[v])Low[u]=Low[v];
            }
            else if(Instack[v]&&Low[u]>DFN[v])
                Low[u]=DFN[v];
        }
        if(Low[u]==DFN[u]){
            scc++;
            do{
                v=Stack[--top];
                Instack[v]=false;
                Belong[v]=scc;
                num[scc]++;
            }
            while(v!=u);
        }
    }
    void solve(int N){
        memset(DFN,0,sizeof(DFN));
        memset(Instack,false,sizeof(Instack));
        memset(num,0,sizeof(num));
        Index=scc=top=0;
        for(int i=1;i<=N;i++)
            if(!DFN[i])
                Tarjan(i);
    }
    void init(){
        tot=0;
        memset(head,-1,sizeof(head));
    }
    
    int main(){
        int N,M;
        int a,b;
    
        while(~scanf("%d%d",&N,&M)){
            if(N==0&&M==0)break;
            init();
    
            for(int i=0;i<M;++i){
                scanf("%d%d",&a,&b);
                addedge(a,b);
            }
    
            solve(N);
    
            bool flag=false;
            for(int i=1;i<=scc;++i)
                if(num[i]==N)
                    flag=true;
    
            if(flag)printf("Yes
    ");
            else printf("No
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    [原] 秋叶原随景
    ReportViewer不连接数据库,自定义DataSet导出到报表
    【程序人生】一个程序员对学弟学妹建议(转)
    c#钩子学习笔记(一)
    解决关于多客户端操作数据库并发问题
    SQL Server 存储过程
    有关抽奖的一个算法
    c#发送邮件含附件
    CrystalReport不连接数据库,自定义DataSet导出到水晶报表
    c#钩子学习笔记(二)
  • 原文地址:https://www.cnblogs.com/gongpixin/p/5020213.html
Copyright © 2020-2023  润新知