zoukankan      html  css  js  c++  java
  • hdu 1269 tarjan求强连通分量

    tarjan求强连通分量的裸题复习,可当做模板。

     1 #include <stack>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 const int N = 10001;
     7 const int M = 100000;
     8 int dfn[N], low[N], head[N];
     9 bool inStack[N];
    10 int n, m, e, cnt, dfs_clock;
    11 stack<int> s;
    12 
    13 struct Edge 
    14 {
    15     int v, next;
    16 } edge[M];
    17 
    18 void init()
    19 {
    20     e = cnt = dfs_clock = 0;
    21     memset( head, -1, sizeof(head) );
    22     memset( dfn, 0, sizeof(dfn) );
    23     memset( inStack, 0, sizeof(inStack) );
    24 }
    25 
    26 void addEdge( int u, int v )
    27 {
    28     edge[e].v = v;
    29     edge[e].next = head[u];
    30     head[u] = e++;
    31 }
    32 
    33 void dfs( int u )
    34 {
    35     dfn[u] = low[u] = ++dfs_clock;
    36     inStack[u] = true;
    37     s.push(u);
    38     for ( int i = head[u]; i != -1; i = edge[i].next )
    39     {
    40         int v = edge[i].v;
    41         if ( dfn[v] == 0 )
    42         {
    43             dfs(v);
    44             if ( low[v] < low[u] )
    45             {
    46                 low[u] = low[v];
    47             }
    48         }
    49         else if ( inStack[v] )
    50         {
    51             if ( dfn[v] < low[u] )
    52             {
    53                 low[u] = dfn[v];
    54             }
    55         }
    56     }
    57     if ( low[u] == dfn[u] )
    58     {
    59         cnt++;
    60         while ( 1 )
    61         {
    62             int tmp = s.top(); s.pop();
    63             inStack[tmp] = false;
    64             if ( tmp == u ) break;
    65         }
    66     }
    67 }
    68 
    69 void solve()
    70 {
    71     for ( int i = 1; i <= n; i++ )
    72     {
    73         if ( !dfn[i] )
    74         {
    75             dfs(i);
    76         }
    77     }
    78 }
    79 
    80 int main ()
    81 {
    82     while ( scanf("%d%d", &n, &m), n + m )
    83     {
    84         int u, v;
    85         init();
    86         while ( m-- )
    87         {
    88             scanf("%d%d", &u, &v);
    89             addEdge( u, v );
    90         }
    91         solve();
    92         printf("%s
    ", ( cnt == 1 ) ? "Yes" : "No");
    93     }
    94     return 0;
    95 }
  • 相关阅读:
    快速排序算法
    CopyOnWrite容器
    map函数的使用
    Hashmap的源码分析
    Tree数据从后台处理类
    Java开学考试感受
    第49讲:乱入——生成器
    第48讲:魔方方法——迭代器
    第47讲:魔方方法——定制序列
    第46讲:魔方方法——描述符(property的原理)
  • 原文地址:https://www.cnblogs.com/huoxiayu/p/4430343.html
Copyright © 2011-2022 走看看