为什么Tarjan不判instack也能AC?
查看原帖
为什么Tarjan不判instack也能AC?
651786
yyc_楼主2022/11/25 16:13

RT,抄的第一篇题解,去掉了关于 instack 的部分。

#include<bits/stdc++.h>
#define N 10050
using namespace std;
struct EDGE {
    int nxt, to;
}edge[N * 20];
int head[20 * N], dfn[N], low[N];
int deg[N], id[N], all[N];
int cnt, tot, sccnt, n, m;
stack<int>s;
inline void add(int x, int y) {
    cnt++;
    edge[cnt].to = y;
    edge[cnt].nxt = head[x];
    head[x] = cnt;
}
void tarjan(int x) {
    dfn[x] = low[x] = ++tot;
    s.push(x);
    for (int i = head[x]; i; i = edge[i].nxt) {
        int u = edge[i].to;
        if (!dfn[u]) {
            tarjan(u);
            low[x] = min(low[x], low[u]);
        }
        else low[x] = min(low[x], dfn[u]);
    }
    int k;
    if (low[x] == dfn[x]) {
        ++sccnt;
        do {
            k = s.top(); s.pop();
            id[k] = sccnt; all[sccnt]++;
        } while (x != k);
    }
}
int main() {
    cin >> n >> m;
    int a, b;
    for (int i = 1; i <= m; i++) {
        cin >> a >> b;
        add(a, b);
    }
    for (int i = 1; i <= n; i++)
        if (!dfn[i])tarjan(i);
    for (int w = 1; w <= n; w++) 
        for (int i = head[w]; i; i = edge[i].nxt) {
            int u = edge[i].to;
            if (id[w] != id[u])
                deg[id[w]]++;
        }
    int tt = 0;
    for (int i = 1; i <= sccnt; i++)
        if (!deg[i]) {
            if (tt) { puts("0"); return 0; }
            tt = i;
        }
    printf("%d\n", all[tt]);
    return 0;
}

AC了

2022/11/25 16:13
加载中...