P4017 最大食物链计数

传送门

这道题是求路径数目,入度为0才需入队,统计出度为0的路径和,一张有向无环图,典型的拓扑排序。

#include
using namespace std;
const int mod=80112002; 
const int maxn=5e3+10;
int n,m,sum;
int ru[maxn],chu[maxn];
int f[maxn];
bool e[maxn][maxn];
queue<int> q;
void topu(){
	for(int i=1;i<=n;i++){
		if(!ru[i]){
			f[i]=1;
			q.push(i);
		}
	}
	while(!q.empty()){
		int d=q.front();
		q.pop();
		for(int i=1;i<=n;i++){
			if(!e[i][d])continue;
			f[i]+=f[d];
			f[i]%=mod;
			ru[i]--;
			if(!ru[i]){
				q.push(i);
				if(!chu[i])
				sum=(sum+f[i])%mod;
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	while(m--){
		int x,y;
		scanf("%d%d",&x,&y);
		e[y][x]=true;
		ru[y]++;
		chu[x]++;
	}
	topu();
	printf("%d\n",sum);
}

你可能感兴趣的:(拓扑排序)