【P4017 最大食物链计数】拓扑排序

两种做法:
第一种:拓扑排序

#include
using namespace std;
int n,m,cnt=0;
#define maxn 5010
#define maxe 500010
#define mod 80112002
struct Edge{
	int to,nxt;
}edge[maxe];
int head[maxn],vis[maxn],in[maxn],out[maxn],sum[maxn];
void add(int x,int y){
	edge[++cnt].to=y;
	edge[cnt].nxt=head[x];
	head[x]=cnt;
}
int main(){
	scanf("%d%d",&n,&m);
	int x,y;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		add(x,y);
		in[y]++;out[x]++;
	}
	queue<int> q;
	//找到入度为0的点
	for(int i=1;i<=n;i++){
		if(!in[i])  q.push(i),sum[i]=1;
	}
	//sum数字记录每个点的路径数目 
	int ans=0;
	while(!q.empty()){
		int v=q.front();
		q.pop();
		for(int i=head[v];i;i=edge[i].nxt){//i是以点v为起点的边的序号 
			int k=edge[i].to;
			sum[k]=(sum[k]+sum[v])%mod;
			in[k]--;
			if(in[k]==0)
			q.push(k);
		}
	}
	for(int i=1;i<=n;i++){
		if(out[i]==0)//只记录是极大路径(不能走下去)的数目 
		ans=(ans+sum[i])%mod;
	}
	cout<<ans<<endl;
}

你可能感兴趣的:(图论)