zoukankan      html  css  js  c++  java
  • 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 }

     

  • 相关阅读:
    【USACO】clocks 遇到各种问题 最后还是参考别人的思路
    【USACO】calfflac
    【USACO】namenum
    【USACO】beads
    最大流问题
    模运算性质 摘自百度百科
    学历是铜牌,能力是银牌,人脉是金牌,思维是王牌
    U盘版Windows 10已经在亚马逊Amazon開始接受预订啦
    hadoop实验:求气象数据的最低温度
    Appium Android Bootstrap源代码分析之启动执行
  • 原文地址:https://www.cnblogs.com/mzg1805/p/10848093.html
Copyright © 2011-2022 走看看