zoukankan      html  css  js  c++  java
  • HDU 1269 迷宫城堡(强连通)

    迷宫城堡




    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<cstdio>
     2 #include<cstring>
     3 #include<vector>
     4 #include<stack>
     5 #include<algorithm>
     6 using namespace std;
     7 
     8 const int maxn=10005;
     9 int lowlink[maxn],dfn[maxn],dfs_clock,m,n;
    10 vector<int>G[maxn];
    11 stack<int>S;
    12 
    13 void init()
    14 {
    15     memset(lowlink,0,sizeof(lowlink));
    16     memset(dfn,0,sizeof(dfn));
    17     dfs_clock=0;
    18     for(int i=1;i<=n;i++)G[i].clear();
    19 
    20 }
    21 
    22 int tarjan(int u)
    23 {
    24     int lowlinku=dfn[u]=++dfs_clock;
    25     S.push(u);
    26     for(int i=0;i<G[u].size();i++)
    27     {
    28         int v=G[u][i];
    29         if(!dfn[v])
    30         {
    31             int lowlinkv=tarjan(v);
    32             lowlinku=min(lowlinkv,lowlinku);
    33         }
    34         else
    35             lowlinku=min(dfn[v],lowlinku);
    36     }
    37     lowlink[u]=lowlinku;
    38     return lowlinku;
    39 }
    40 
    41 int main()
    42 {
    43     while(scanf("%d%d",&n,&m),m|n)
    44     {
    45         init();
    46         for(int i=0;i<m;i++)
    47         {
    48             int u,v;
    49             scanf("%d%d",&u,&v);
    50             G[u].push_back(v);
    51         }
    52         for(int i=1;i<=n;i++)
    53             if(!dfn[i])
    54                 tarjan(i);
    55         int j;
    56         for(j=1;j<=n-1;j++)
    57             if(lowlink[j]!=lowlink[j+1])
    58                 break;
    59         if(j==n)
    60             puts("Yes");
    61         else
    62             puts("No");
    63     }
    64     return 0;
    65 }
  • 相关阅读:
    LINUX查看进程开始时间、结束时间、运行时间
    excel字符处理函数
    oracle RMAN参数配置详解
    Linux添加双IP
    免费软电话 — XLite 的安装及配置向导
    Asterisk实现寻呼对讲广播的Page()命令详解
    自动化工具的重要性
    负载均衡之应用请求路由模块的使用(ARR)(七)[使用ARR来实现主机名共享]
    负载均衡之应用请求路由模块的使用(ARR)(二)[安装]
    需求管理随笔
  • 原文地址:https://www.cnblogs.com/homura/p/4852299.html
Copyright © 2011-2022 走看看