社区讨论

84pts玄关求调,vector 且马蜂良好

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

讨论操作

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

当前回复
11 条
当前快照
1 份
快照标识符
@m04ozc29
此快照首次捕获于
2024/08/22 10:57
2 年前
此快照最后确认于
2025/11/05 00:38
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10005;

int n, m, x, y;
vector<int> g[MAXN];
vector<int> lg[MAXN];
stack<int> s;

int dfn[MAXN], low[MAXN], depth, cnt;
int belong[MAXN], num[MAXN], Out[MAXN];
bool is[MAXN];

void tarjan(int u) {
    dfn[u] = low[u] = ++depth;
    is[u] = true, s.push(u);
    for (int v : g[u]) {
        if (!dfn[v]) {
            tarjan(v);
            low[u] = min(low[u], low[v]);
        } else if (is[v])
            low[u] = min(low[u], dfn[v]);
    }
    if (dfn[u] == low[u]) {
        cnt++;
        int v;
        do {
            v = s.top();
            is[v] = false, s.pop();
            belong[v] = cnt;
            num[cnt]++;
        } while (u != v);
    }
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; i++) {
        scanf("%d%d", &x, &y);
        g[x].push_back(y);
    }
    for (int i = 1; i <= n; i++)
        if (!dfn[i])
            tarjan(i);
    for (int i = 1; i <= n; i++) {
        int u = belong[i];
        for (int j : g[i]) {
            int v = belong[j];
            if (u != v) {
                lg[u].push_back(v);
                Out[u] += num[v];
            }
        }
    }
    int ans = 0, tot = 0;
    for (int i = 1; i <= cnt; i++)
        if (Out[i] == 0)
            ans += num[i], tot++;
    printf("%d\n", tot > 2 ? 0 : ans);
    return 0;
}

回复

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

正在加载回复...