• HDU1269 迷宫城堡


    HDU1269 迷宫城堡

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 2092    Accepted Submission(s): 886


    Problem Description
    为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i。
     

    Input
    输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。
     

    Output
    对于输入的每组数据,如果任意两个房间都是相互连接的,输出"Yes",否则输出"No"。
     

    Sample Input
    3 3 1 2 2 3 3 1 3 3 1 2 2 3 3 2 0 0
     

    Sample Output
    Yes No
     
    *********************************************************************
    好题啊!为什么是好题啊。我好久没看到中文题了。。。。。。。
    解题思路:有向图的强连通,求强连通分量是否为1。
    #include <stdio.h>
    #include <string.h>
    #include <vector>
    #include <stack>
    #define MIN(a,b) ((a)<(b)?(a):(b))
    #define N 10005
    using namespace std;
    
    stack<int>sta;
    vector<int>gra[N];
    int dfn[N],low[N],now,vis[N],sum;
    int n,m;
    
    void ini(void)
    {
        memset(dfn,0,sizeof(dfn));
        memset(low,0,sizeof(low));
        memset(vis,0,sizeof(vis));
        now=sum=0;
        for(int i=1;i<=n;i++)
            gra[i].clear();
        while(sta.empty()==0)
            sta.pop();
    }
    
    void tarjan(int s,int p)
    {
        vis[s]=2;
        dfn[s]=low[s]=++now;
        sta.push(s);
        for(int i=0;i<gra[s].size();i++)
        {
            int t=gra[s][i];
            if(!dfn[t])
                tarjan(t,s),low[s]=MIN(low[s],low[t]);
            else
                if(vis[t]==2)
                    low[s]=MIN(low[s],dfn[t]);
        }
        if(low[s]==dfn[s])
        {
            sum++;
            while(!sta.empty())
            {
                int t=sta.top();
                sta.pop();
                vis[t]=1;
                if(t==s)break;
            }
        }
    }
    
    void re(void)
    {
        for(int i=1;i<=m;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            gra[a].push_back(b);
        }
    }
    
    void run(void)
    {
        for(int i=1;i<=n;i++)
            if(!dfn[i])
                tarjan(i,0);
        if(sum>1)
            puts("No");
        else
            puts("Yes");
    }
    
    int main()
    {
        while(scanf("%d%d",&n,&m),n+m)
        {
            ini();
            re();
            run();
        }
    }
    

      

  • 相关阅读:
    【QA3】apache2启动失败问题
    查看OS位数
    软件测试开发 SDET
    【QA1】mysql下max_connections问题
    Js 四舍五入
    word中如何设置不连续页码 (转)
    隐藏select边框及下接箭头方法
    where 与 having 的区别
    asp.net 浏览器标题栏加入图标 方法
    AjaxControlToolkit CollapsiblePanelExtender用法
  • 原文地址:https://www.cnblogs.com/Fatedayt/p/2181775.html
Copyright © 2020-2023  润新知