题目链接
http://noi-test.zzstep.com/contest/0x20%E3%80%8C%E6%90%9C%E7%B4%A2%E3%80%8D%E4%BE%8B%E9%A2%98/2101%20%E5%8F%AF%E8%BE%BE%E6%80%A7%E7%BB%9F%E8%AE%A1
分析
有向无环图,记忆化搜索即可,设二进制 f [ i ] f[i] f[i] 表示 i i i 可以到达的点。
AC代码
#include <cstdio>
#include <bitset>
using namespace std;
inline int read() {
int num = 0;
char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9')
num = num * 10 + c - '0', c = getchar();
return num;
}
const int maxn = 3e4 + 5;
int head[maxn], eid;
struct Edge {
int v, next;
} edge[maxn];
inline void insert(int u, int v) {
edge[++eid].v = v;
edge[eid].next = head[u];
head[u] = eid;
}
int vis[maxn];
bitset<maxn> s[maxn];
void dfs(int u) {
s[u][u] = 1;
for (int p = head[u]; p; p = edge[p].next) {
int v = edge[p].v;
if (!vis[v]) dfs(v);
s[u] |= s[v];
}
vis[u] = 1;
}
int main() {
int n = read(), m = read();
for (int i = 1; i <= m; ++i) {
int x = read(), y = read();
insert(x, y);
}
for (int i = 1; i <= n; ++i) {
if (!vis[i]) dfs(i);
printf("%lld\n", s[i].count());
}
return 0;
}