1 条题解

  • 0
    @ 2024-10-31 21:10:41
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5 + 5;
    const long long mod = 1e9 + 7;
    
    int n, m, a[maxn], dfn[maxn], low[maxn], id[maxn], idx, scc, val[maxn];
    bool ins[maxn];
    stack<int> stk;
    vector<int> g[maxn];
    
    void tarjan(int u) {
        dfn[u] = low[u] = ++idx;
        stk.push(u);
        ins[u] = true;
        for (auto v : g[u]) {
            if (!dfn[v]) {
                tarjan(v);
                low[u] = min(low[u], low[v]);
            }
            else if (ins[v])
                low[u] = min(low[u], dfn[v]);
        }
        if (low[u] == dfn[u]) {
            val[++scc] = 1e9 + 1;
            int v;
            do {
                v = stk.top();
                stk.pop();
                ins[v] = false;
                id[v] = scc;
                val[scc] = min(val[scc], v);
            } while (v != u);
        }
    }
    
    int main() {
        scanf("%d%d", &n, &m);
        while (m--) {
            int u, v;
            scanf("%d%d", &u, &v);
            g[u].push_back(v);
        }
        for (int i = 1; i <= n; i++)
            if (!dfn[i])
                tarjan(i);
        cout << scc << endl;
        for (int i = 1; i <= n; i++) {
            if (i > 1) cout << " ";
            cout << val[ id[i] ];
        }
        cout << endl;
        return 0;
    }
    
    
    
    • 1

    信息

    ID
    72
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    3
    已通过
    3
    上传者