比较明显的记忆化搜索, 表示节点 往后有多少条路径。
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;
}