zoukankan      html  css  js  c++  java
  • Tarjan+模板

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 #include<math.h>
     5 #include<algorithm>
     6 #include<iostream>
     7 #include<set>
     8 #include<stack>
     9 #include<queue>
    10 #include<map>
    11 #include<vector>
    12 using namespace std;
    13 
    14 const int maxn = 105;
    15 const int maxm = 1005;
    16 const int inf = 0x3f3f3f3f;
    17 const double pi = acos(-1.0);
    18 const double eps = 1e-8;
    19 
    20 struct Edge{
    21     int u,v,next;
    22 }edge[ maxn*maxn ];
    23 int cnt,head[ maxn ];
    24 int vis[ maxn ],belong[ maxn ];
    25 stack<int>s;
    26 int dfn[ maxn ],low[ maxn ];
    27 int Cnt ,id ;
    28 
    29 void init(){
    30     while( !s.empty() )
    31         s.pop();
    32     Cnt = 0;
    33     id = 0;
    34     memset( dfn,-1,sizeof( dfn ) );
    35     memset( low,-1,sizeof( low ) );
    36     cnt = 0;
    37     memset( head,-1,sizeof( head ) );
    38 }
    39 
    40 void addedge( int a,int b ){
    41     edge[ cnt ].u = a;
    42     edge[ cnt ].v = b;
    43     edge[ cnt ].next = head[ a ];
    44     head[ a ] = cnt++;
    45 }
    46 
    47 void tarjan( int cur ){
    48     dfn[ cur ] = low[ cur ] = id++;
    49     vis[ cur ] = 1;
    50     s.push( cur );
    51     for( int i=head[ cur ];i!=-1;i=edge[i].next ){
    52         int nxt = edge[i].v;
    53         if( dfn[ nxt ]==-1 ){
    54             tarjan( nxt );
    55             low[ cur ] = min( low[ nxt ],low[ cur ] );
    56         }
    57         else if( vis[ nxt ]==1 ){
    58             low[ cur ] = min( dfn[ nxt ],low[ cur ] );
    59         }
    60     }
    61     if( dfn[ cur ]==low[ cur ] ){
    62         Cnt ++;
    63         while( 1 ){
    64             int tmp = s.top();
    65             s.pop();
    66             vis[ tmp ] = 0;
    67             belong[ tmp ] = Cnt;
    68             if( tmp==cur ) break;
    69         }
    70     }
    71 }
    72 
    73 int main(){
    74     int n,m;
    75     while( scanf("%d%d",&n,&m)==2 ){
    76         int a,b;
    77         init();
    78         while( m-- ){
    79             scanf("%d%d",&a,&b);
    80             addedge( a,b );
    81         }
    82         for( int i=1;i<=n;i++ ){
    83             if( dfn[i]==-1 ){
    84                 tarjan( i );
    85             }
    86         }
    87         printf("缩点 = %d
    ",Cnt);
    88     }
    89     return 0;
    90 }
    View Code
    keep moving...
  • 相关阅读:
    【博弈论】囚徒困境
    【LTE与5G】
    【现代通信技术】绪论
    【操作系统】 逻辑结构
    【密码学】
    【计算机网络】网络应用
    部署docker仓库-Harbor
    ELK+filebeat收集K8S平台日志
    istio-http流量管理
    K8S集群部署istio
  • 原文地址:https://www.cnblogs.com/xxx0624/p/3264258.html
Copyright © 2011-2022 走看看