bzoj1529: [POI2005]ska Piggy banks

tarjan 较裸的一道题, 难在建图。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N = 1000010;
 6 int a[N] , dfn[N] , low[N];
 7 int tot , top;
 8 int sta[N];
 9 bool ins[N];
10 int bel[N] , cnt , cd[N];
11 void tarjan(int x)
12 {
13     dfn[x] = low[x] = ++tot;
14     ins[x] = 1;
15     sta[++top] = x;
16     if(!dfn[a[x]])
17         tarjan(a[x]) , low[x] = min(low[x] , low[a[x]]);
18     else 
19         if(ins[a[x]])
20         low[x] = min(low[x] , dfn[a[x]]);
21     if(dfn[x] == low[x])
22     {
23         int t;
24         cnt ++ ;
25         do
26         {
27             t = sta[top -- ];
28             ins[t] = 0;
29             bel[t] = cnt;
30         }while(t != x);
31     }
32 }
33 int main()
34 {
35     int n , i , ans = 0;
36     scanf("%d" , &n);
37     for(i = 1 ; i <= n ; i ++ )
38         scanf("%d" , &a[i]);
39     for(i = 1 ; i <= n ; i ++ )
40         if(!dfn[i])
41             tarjan(i);
42     for(i = 1 ; i <= n ; i ++ )
43         if(bel[i] != bel[a[i]])
44             cd[bel[i]] ++ ;
45     for(i = 1 ; i <= cnt ; i ++ )
46         if(!cd[i])
47             ans ++ ;
48     printf("%d\n" , ans);
49     return 0;
50 }
View Code

 

转载于:https://www.cnblogs.com/0724-zcsblog/p/11507254.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值