拓扑排序:最大食物链计数

题目来自:点击这里

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=5005;
const int maxm=500005;
const int mod=80112002;
int in[maxn],head[maxn],num=0,ans=0,out[maxn],vis[maxn];
struct node{
    
    
	int next,to;
}kkk[maxm];
void addedge(int u,int v){
    
    
	kkk[++num].next=head[u];
	kkk[num].to=v;
	head[u]=num;
}
int main()
{
    
    	
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=0;i<m;++i){
    
    
		int u,v;
		scanf("%d%d",&u,&v);
		addedge(u,v);
		++out[u],++in[v];
	}
	queue<int>q;
	for(int i=1;i<=n;++i){
    
    
		if(!in[i]){
    
    
			vis[i]=1;
			q.push(i);
		}
	}
	while(!q.empty()){
    
    
		int u=q.front();q.pop();
		for(int i=head[u];i;i=kkk[i].next){
    
    
			int v=kkk[i].to;
			vis[v]=(vis[v]+vis[u])%mod;
			--in[v];
			if(!in[v]){
    
    
				if(!out[v]){
    
    
					ans=(ans+vis[v])%mod;
				}
				else{
    
    
					q.push(v);
				}
			}
		}
	}
	printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45695839/article/details/114420966
今日推荐