2019-2020 ACM-ICPC Latin American Regional Programming Contest I - Improve SPAM 树形dp?

#include<iostream>
#include<cstring>
#define int long long
using namespace std;
const int N=4010,mod=1e9+7;
int a[N];
int e[N*N],ne[N*N],idx,h[N];
int st[N];
int ans;
int ans1[N];
int read()
{
	int res=0,ch,flag=0;
	if((ch=getchar())=='-')             //判断正负
		flag=1;
	else if(ch>='0'&&ch<='9')           //得到完整的数
		res=ch-'0';
	while((ch=getchar())>='0'&&ch<='9')
		res=res*10+ch-'0';
	return flag?-res:res;
}
void add(int a,int b)
{
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
}
int dp[N];
int res;
int dfs(int u,int fa)
{
	if(dp[u]!=-1)
		return dp[u];
	if(st[u]==0)
	{
		res++;
		dp[u]=1;
		return dp[u];
	}
	int sum=0;
	for(int i=h[u]; i!=-1; i=ne[i])
	{
		int j=e[i];
		if(j==fa)
			continue;
		sum=(sum+(dfs(j,u)%mod))%mod;
	}
	dp[u]=sum;
	return sum;
}
signed main()
{
	memset(dp,-1,sizeof dp);
	memset(h,-1,sizeof h);
	int n=read(),l=read();
	for(int i=1; i<=l; i++)
	{
		st[i]=1;
		int k=read();
		while(k--)
		{
			int a=i;
			int b=read();
			add(i,b);
		}
	}
	ans=dfs(1,-1);
	cout<<ans%mod<<" "<<res%mod<<endl;
}
posted @ 2020-04-09 10:14  晴屿  阅读(141)  评论(0编辑  收藏  举报