• 1


     1 #include <bits/stdc++.h>
     2 #define up(i,l,r) for(register int i = (l); i <= (r); i++)
     3 #define dn(i,l,r) for(register int i = (l); i >= (r); i--)
     4 #define ll long long
     5 using namespace std;
     6 template <typename T>void in(T &x){
     7     x = 0; T f = 1; char ch = getchar();
     8     while(!isdigit(ch)) {if(ch == '-') f = -1; ch = getchar();}
     9     while( isdigit(ch)) {x = 10 * x + ch - 48; ch = getchar();}
    10     x *= f;
    11 }
    12 template <typename T>void put(T x){
    13     //if(x < 0) x = -x,putchar('-');
    14     if(x > 9) put(x/10);
    15     putchar(x%10 + 48);
    16 }
    17 const int N = 100005;
    18 int n;
    19 
    20 struct edge{
    21     int v,nxt;
    22 }e[N]; int tot,head[N];
    23 
    24 void add(int u,int v){ e[++tot] = (edge){v,head[u]}; head[u] = tot;}
    25 
    26 int dfn[N],low[N],sn,cnt,size[N],belong[N],f[N],maxn[N];
    27 bool instack[N],vis[N];
    28 
    29 stack<int>s;
    30 
    31 void debug(){
    32     int t;
    33     while(!s.empty()){
    34         t = s.top(); put(t); putchar(' ');
    35         s.pop();
    36     }
    37 }
    38 
    39 void tarjan(int u){
    40     
    41     dfn[u] = low[u] = ++sn;
    42     s.push(u);
    43     instack[u] = 1;
    44     //if(u == 3) debug();
    45     for(int i = head[u]; i; i = e[i].nxt){
    46         int v = e[i].v;
    47         if(!dfn[v]){
    48             tarjan(v);
    49             low[u] = min(low[u],low[v]);
    50         }
    51         else if(instack[v]) low[u] = min(low[u],dfn[v]);
    52     }
    53     int t = -1;
    54     if(low[u] == dfn[u]){
    55         ++cnt;
    56         while(t != u){
    57             t = s.top();
    58             s.pop();
    59             instack[t] = 0;
    60             belong[t] = cnt; 
    61             ++size[cnt];
    62         }
    63     }
    64 }
    65 
    66 void dfs(int u){
    67     if(f[belong[u]]) return;
    68     f[belong[u]] = size[belong[u]];
    69     for(int i = head[u]; i; i = e[i].nxt){
    70         int v = e[i].v;
    71         //if(vis[belong[v]]) continue;
    72         if(belong[u] == belong[v]) continue;
    73         dfs(v); //vis[belong[v]] = 1;
    74         f[belong[u]] += f[belong[v]];
    75     }
    76 }
    77 
    78 int main(){
    79     int v;
    80     in(n);
    81     up(i,1,n){
    82         in(v);
    83         add(i,v);
    84     }
    85     up(i,1,n) if(!dfn[i]) tarjan(i);
    86     up(i,1,n) if(!vis[i]) dfs(i);
    87     up(i,1,n){
    88         put(f[belong[i]]); 
    89         putchar('
    ');
    90     }
    91     return 0;
    92 }

     

  • 相关阅读:
    java_oop_方法2
    POJ 3276 Face The Right Way(反转)
    POJ 3276 Face The Right Way(反转)
    POJ 2566 Bound Found(尺取法,前缀和)
    POJ 2566 Bound Found(尺取法,前缀和)
    POJ 3320 Jessica's Reading Problem(尺取法)
    POJ 3320 Jessica's Reading Problem(尺取法)
    POJ 3061 Subsequence(尺取法)
    POJ 3061 Subsequence(尺取法)
    HDU 1222 Wolf and Rabbit(欧几里得)
  • 原文地址:https://www.cnblogs.com/mzg1805/p/10848093.html
Copyright © 2020-2023  润新知