• HDU 1269 迷宫城堡(强连通)


    ( ̄▽ ̄)"

    //这道题WA的惨烈,又跪在n,m同时为0输入结束这个点上
    //以后用n+m或者n||m,不要再用n&&m判了
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cstdlib>
    #include<vector>
    using namespace std;
    typedef long long ll;
    const int MAXN=100010;
    
    struct edge
    {
        int next,to;
    }E[MAXN];
    
    int head[MAXN],Ecou;  //Ecou:边下标
    int Stack[MAXN],top; //top:栈顶
    int Belong[MAXN],Bcnt;  //Bcnt:强连通分量个数
    int Index;  //Index:时间戳
    int DFN[MAXN],LOW[MAXN];
    bool inStack[MAXN];
    
    void add_edge(int u,int v)
    {
        E[Ecou].to=v;
        E[Ecou].next=head[u];
        head[u]=Ecou++;
    }
    
    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=E[i].next)
        {
            v=E[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])
        {
            ++Bcnt;
            do
            {
                v=Stack[--top];
                inStack[v]=false;
                Belong[v]=Bcnt;
            }while(v!=u);
        }
    }
    
    void getSCC(int n)
    {
        for(int i=1;i<=n;i++)
            if(!DFN[i])
                Tarjan(i);
    }
    
    void init(int n)
    {
        Ecou=Index=Bcnt=top=0;
        for(int i=1;i<=n;i++)
        {
            head[i]=-1;
            DFN[i]=LOW[i]=Belong[i]=0;
            inStack[i]=0;
        }
    }
    
    int main()
    {
        int n,m,u,v,i;
        while(scanf("%d %d",&n,&m)&&n+m)
        {
            init(n);
            while(m--)
            {
                scanf("%d %d",&u,&v);
                add_edge(u,v);
            }
            getSCC(n);
            for(i=2;i<=n;i++)
                if(Belong[i]!=Belong[i-1])
                    break;
            if(i>n) printf("Yes
    ");
            else printf("No
    ");
        }
        return 0;
    }
  • 相关阅读:
    线程安全与可重入编写方法
    新手MySQL工程师必备命令速查手册
    分布式之数据库和缓存双写一致性方案解析
    在java代码中用xslt处理xml文件
    Java并发编程之并发代码设计
    Java多线程和并发基础
    Java多线程面试大全
    springboot获取URL请求参数的多种方式
    JAVA文件转换为Base64
    Silver Cow Party
  • 原文地址:https://www.cnblogs.com/atmacmer/p/5196897.html
Copyright © 2020-2023  润新知