P4017 最大食物链计数 toposort计数
作者:
多米尼克領主的致意
,
2024-05-07 18:30:07
,
所有人可见
,
阅读 2
拓扑排序计数
记忆化搜索写法, 主要是统计各个点的入度和出度 然后遍历入读为0的点
和toposort思路一样
#include<bits/stdc++.h>
using namespace std;
const int N = 5010, M = 5e5 + 10, mod = 80112002;
int h[N], idx;
int n, m;
int idu[N], odu[N];
struct edge{
int from, to, w;
int ne;
}E[M];
int vis[N];
void add(int a, int b)
{
E[idx].to = b;
E[idx].ne = h[a];
h[a] = idx++;
}
int dfs(int u)
{
if(!odu[u]) return 1;
if(vis[u])return vis[u];
int ans = 0;
for(int i = h[u];~i;i = E[i].ne)
{
int j = E[i].to;
ans = (ans + dfs(j)) % mod;
}
vis[u] = ans;
return vis[u];
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
memset(h, -1, sizeof h);
cin >> n >> m;
for(int i = 1;i <= m;i++)
{
int x, y;
cin >> x >> y;
idu[x]++, odu[y]++;
add(y, x);
}
int res = 0;
// cout << h[1] << endl;
// cout << vis[1] << endl;
for(int i = 1;i <= n;i++){
if(!idu[i])res = (res + dfs(i)) % mod;
}
cout << res;
}