POJ 1236 强联通分量

链接:

http://poj.org/problem?id=1236

代码:

31 int index = 0;
32 int low[MAXN], dfn[MAXN];
33 int vis[MAXN], bel[MAXN];
34 VI G[MAXN];
35 stack<int> S;
36 int scc_cnt;
37 
38 void tarjan(int u) {
39     dfn[u] = low[u] = ++index;
40     S.push(u); vis[u] = 1;
41     rep(i, 0, G[u].size()) {
42         int v = G[u][i];
43         if (!dfn[v]) {
44             tarjan(v);
45             low[u] = min(low[u], low[v]);
46         }
47         else if (vis[v]) low[u] = min(low[u], dfn[v]);
48     }
49     if (low[u] == dfn[u]) {
50         scc_cnt++;
51         while (1) {
52             int now = S.top(); S.pop();
53             vis[now] = 0;
54             bel[now] = scc_cnt;
55             if (now == u) break;
56         }
57     }
58 }
59 
60 int n;
61 int in[MAXN], out[MAXN];
62 
63 void scc() {
64     index = scc_cnt = 0;
65     memset(dfn, 0, sizeof(dfn));
66     rep(i, 0, n) if (!dfn[i]) tarjan(i);
67 }
68 
69 int main() {
70     cin >> n;
71     int a;
72     rep(i, 0, n) while (cin >> a, a) G[i].pb(a - 1);
73     scc();
74     if (scc_cnt == 1) {
75         cout << 1 << endl << 0 << endl;
76         return 0;
77     }
78     rep(u, 0, n) rep(i, 0, G[u].size()) {
79         int v = G[u][i];
80         if (bel[u] != bel[v]) {
81             out[bel[u]]++;
82             in[bel[v]]++;
83         }
84     }
85     int in_tot = 0, out_tot = 0;
86     rep(i, 1, scc_cnt + 1) {
87         if (!in[i]) in_tot++;
88         if (!out[i]) out_tot++;
89     }
90     cout << in_tot << endl << max(in_tot, out_tot) << endl;
91     return 0;
92 }

 

转载于:https://www.cnblogs.com/baocong/p/6754613.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值