BZOJ 4562: [Haoi2016]食物链

比较明显的记忆化搜索, f [ i ] 表示节点 i 往后有多少条路径。

qwq……HAOI为什么出这么简单的题啊_(:з」∠)_


一个点的情况不计入答案! 注意读题! 注意读题! 注意读题! ! !

#include <cstdio>
#include <vector>

const int N = 100005;
std::vector<int> G[N];

int dgr[N], f[N], ans;

int read() {
    int x = 0; char c = getchar();
    while (c < '0' || c > '9') c = getchar();
    while (c >= '0' && c <= '9') {
        x = (x << 3) + (x << 1) + (c ^ 48);
        c = getchar();
    }
    return x;
}
void dfs(int u) {
    int sz = G[u].size();
    if (sz == 0) { f[u] = 1; return; }
    for (int i = 0; i < sz; ++i) {
        int v = G[u][i];
        if (!f[v]) dfs(v);
        f[u] += f[v];
    }
}

int main() {
    int n = read(), m = read();
    while (m--) {
        int x = read(), y = read();
        G[x].push_back(y); ++dgr[y];
    }
    for (int i = 1; i <= n; ++i) //一个点不计入! 一个点不计入! 一个点不计入!
        if (dgr[i] == 0 && G[i].size()) dfs(i), ans += f[i];
    printf("%d\n", ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Milkyyyyy/article/details/81395091