60分 dfs wa 求助
查看原帖
60分 dfs wa 求助
884905
shenqing_QAQ楼主2023/12/3 10:44
#include<bits/stdc++.h>
using namespace std;
const long long mod = 80112002;
const int N = 5005;//最大值
int ans[N];//记忆化搜索
int maxn,n,m,q,b;//maxn总和 q,b输入用
bool topy[N], fronty[N];//记录是不是食物链开头或结尾
short s[N][N];//s[i][j]表示被i吃的第j种生物,s[i][0]表示i在食物网中吃的生物的数量
int dfs(int i)//以i结尾的食物链条数
{
	if (ans[i] != -1) return ans[i]%mod;//
	if (!fronty[i] && !topy[i])//如果是单独一个的
	{
		ans[i] = 0;
		return 0;	
	}
	if (!fronty[i])//如果是食物链开头
	{
		ans[i] = 1;
		return 1;
	}
	ans[i] = 0;//赋初值
	for (int j = 1; j <= s[i][0]; j++)ans[i] = (ans[i]+max(1, dfs(s[i][j])))%mod;//加上每一种被他吃的动物的食物链条数
	return ans[i]%mod;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	memset(ans, -1, N);
	cin >> n>>m;
	while (m-- && cin >> q >> b)
	{
		topy[q] = 1;//不是食物链结尾
		fronty[b] = 1;//不是食物链开头
		s[b][++s[b][0]] = q;
	}
	for (int i = 1; i <= n; i++)
	{
		if (!topy[i]) maxn += dfs(i)%mod;//是最佳消费者就加上以他结尾的条数
		maxn %= mod;
	}
	cout << maxn%mod;
	return 0;
}
2023/12/3 10:44
加载中...