20分求助
查看原帖
20分求助
362627
frank15楼主2021/3/13 09:33
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#define int long long
using namespace std;
const int maxn=5e3+5,mod=8011200280112002 ;
int n,m,ans,U,V;
int indegree[maxn],outdegree[maxn],dp[maxn];
vector<int> v[maxn];
void topo(){
	queue<int> q;
	for(int i=1;i<=n;i++)
		if(!indegree[i]){
			dp[i]=1;
			q.push(i);
		}
	while(q.size()){
		int now=q.front();
		q.pop();
		for(int i=0;i<v[now].size();i++){
			indegree[v[now][i]]--;
			dp[v[now][i]]=(dp[v[now][i]]%mod+dp[now]%mod)%mod;
			if(!indegree[v[now][i]])
				q.push(v[now][i]);
		}
	}
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%lld%lld",&U,&V);
		v[V].push_back(U);
		indegree[U]++;
		outdegree[V]++;
	}
	topo();
	for(int i=1;i<=n;i++)
		if(!outdegree[i])	
			ans=(ans+dp[i])%mod;
	printf("%lld\n",ans);
	return 0;
}
2021/3/13 09:33
加载中...