最大食物链计数
题目
解析
裸拓扑排序,稍作改动即可AC
注意事项:
1,只有入度为0的点答案初值才为1
2,只有出度为0的点才要累加进答案
3,取余
code:
#include<cstdio>
#include<queue>
#define mod 80112002
using namespace std;
int n,m,in[5010],head[5010],a[500010],b[500010],nxt[500010],ans[5010],t=0,k;
bool out[5010];
queue <int> c;
void topo()
{
while(!c.empty())
{
k=c.front(),c.pop();
for(int i=head[k];i;i=nxt[i])
{
ans[b[i]]=(ans[b[i]]+ans[k])%mod,in[b[i]]--;
if(in[b[i]]==0)c.push(b[i]);
}
}
return;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a[i],&b[i]);
nxt[i]=head[a[i]];
head[a[i]]=i;
in[b[i]]++;
out[a[i]]=1;
}
for(int i=1;i<=n;i++)if(in[i]==0)ans[i]=1,c.push(i);
topo();
for(int i=1;i<=n;i++)if(!out[i])t=(t+ans[i])%mod;
printf("%d",t);
return 0;
}