zoukankan      html  css  js  c++  java
  • P2661 信息传递 强连通分量

    题目链接:

    http://www.luogu.org/problem/show?pid=2661

    题解:

    这题求最小的单向环。

    可因为每个节点初度为1,所以所有的强联通分量都只能是单向环。

    所以就是有向图强连通分量的模板题。

    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<stack>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    
    const int maxn = 200000 + 10;
    const int INF = 0x3f3f3f3f;
    
    vector<int> G[maxn];
    int pre[maxn], lowlink[maxn], sccno[maxn], dfs_clock, scc_cnt;
    stack<int> S;
    
    int n,ans;
    
    void dfs(int u) {
        pre[u] = lowlink[u] = ++dfs_clock;
        S.push(u);
        for (int i = 0; i < G[u].size(); i++) {
            int v = G[u][i];
            if (!pre[v]) {
                dfs(v);
                lowlink[u] = min(lowlink[u], lowlink[v]);
            }
            else if (!sccno[v]) {
                lowlink[u] = min(lowlink[u], pre[v]);
            }
        }
        if (lowlink[u] == pre[u]) {
            scc_cnt++;
            int cnt = 0;
            for (;;) {
                cnt++;
                int x = S.top(); S.pop();
                sccno[x] = scc_cnt;
                if (x == u) break;
            }
            if(cnt>1) ans = min(ans, cnt);
        }
    }
    
    void find_scc(int n) {
        dfs_clock = scc_cnt = 0;
        memset(sccno, 0, sizeof(sccno));
        memset(pre, 0, sizeof(pre));
        for (int i = 0; i < n; i++) if (!pre[i]) dfs(i);
        //for (int i = 0; i < n; i++) printf("sccno[%d]:%d
    ", i, sccno[i]);
    }
    
    void init() {
        for (int i = 0; i < n; i++) G[i].clear();
        ans = INF;
    }
    
    int main() {
        while (scanf("%d", &n) == 1 && n) {
            init();
            for (int i = 0; i < n; i++) {
                int v;
                scanf("%d", &v); v--;
                G[i].push_back(v);
            }
            find_scc(n);
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    PO-审批设置
    DIS-接收方式设置入口
    网约车
    汽车租赁
    共享单车
    共享充电宝
    佛教四大名山|道教四大名山|五岳|名山
    我读过的诗词文章书籍
    我看过的电影
    redis异常解决:jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set
  • 原文地址:https://www.cnblogs.com/fenice/p/5564899.html
Copyright © 2011-2022 走看看