社区讨论

缩点板子mle求助

P2341[USACO03FALL / HAOI2006] 受欢迎的牛 G参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lwa9xs1e
此快照首次捕获于
2024/05/17 14:03
2 年前
此快照最后确认于
2024/05/17 14:54
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using i64 = long long;
struct SCC {
    int n;
    std::vector<std::vector<int>> adj;
    std::vector<int> dfn, low, stk, bel;
    int cur, cnt;
    SCC(){}
    SCC(int n) {
        init(n);
    }
    void init(int n) {
        this->n = n;
        adj.assign(n, {});
        dfn.assign(n, -1);
        stk.clear();
        low.assign(n, -1);
        bel.assign(n, -1);
    }
    void addEdge(int u, int v) {
        adj[u].push_back(v);
    }
    void dfs(int x) {
        dfn[x] = low[x] = cur++;
        stk.push_back(x);
        for (auto y: adj[x]) {
            if(dfn[y] == -1) {
                dfs(y);
                low[x] = std::min(low[x], low[y]);
            }
            else if(bel[y] == -1) {
                low[x] = std::min(low[x], dfn[y]);
            }
        }
        if(dfn[x] == low[x]) {
            int y;
            do{
              y = stk.back();
              bel[y] = cnt;
              stk.pop_back();
            } while(x != y);
            ++cnt;
        }
    }
    std::vector<int> work() {
        for (int i = 0; i < n; ++i) {
            if(dfn[i] == -1) dfs(i);
        }
        return bel;
    }
};

int main() {
    
    std::cin.tie(nullptr)->sync_with_stdio(false);
    int n, m;
    std::cin >> n >> m;
    SCC g(n);
    for (int i = 0; i < m; ++i) {
        int u, v;
        std::cin >> u >> v;
        --u, --v;
        g.addEdge(u, v);
    }
    
    auto bel = g.work();
    std::vector<int> d(g.cnt), sz(g.cnt);
    for (int i = 0; i < n; ++i) {
        ++sz[bel[i]];
        for (auto y : g.adj[i]) {
            if(bel[i] == bel[y]) continue;
            ++d[bel[i]];
        }
    }
    i64 ans = 0;
    for (int i = 0; i < g.cnt; ++i) {
        if (d[i]) continue;
        if (ans != 0) {
            ans = 0;
            break;
        }
        ans = sz[i];
    }
    std::cout << ans << '\n';
}

回复

0 条回复,欢迎继续交流。

正在加载回复...