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

洛谷 P4017 -> Click Here

题意

一个 DAG(又向无环图),询问从无入度的点到无出度的点的路径个数有多少个

思路

拓扑排序

找出无出度的点加入到队列中,更新与当前点有边的点,删去此点及其边,再寻找新的无入度的点加入到队列中

code

#include<iostream>
#include<map>
#include<queue>
#define REP(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
const int MOD = 80112002;//从原题上复制下来,格式有错没看见,狂WA不过(裂开
struct edge{
	int nxt;
	int to;
}G[500005];//链式前向星 这里数组大小为边的数目,不是点的(WA死我了
int head[50005],cnt;
int n,m,ans;
map<int,int> mp,chu;
queue<int> q;
int A[50005];
void Add(int a,int b){
	cnt++;
	G[cnt].nxt=head[a];
	head[a]=cnt;
	G[cnt].to=b;
}
int main(){
	cin>>n>>m;
	for(int i=1,a,b;i<=m;i++){
		cin>>a>>b;
		chu[a]++;
		mp[b]++;
		Add(a,b);
	}
	for(int i=1;i<=n;i++){
		if(mp[i]==0) {q.push(i);A[i]=1;}
	}
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=head[x];i;i=G[i].nxt){
			int u=G[i].to;
			A[u]=(A[u]+A[x])%MOD;
			mp[u]--;
			if(mp[u]==0){
				q.push(u);
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(chu[i]==0){
			ans=(ans+A[i])%MOD;
		}
	}
	cout<<ans<<endl;
}
上一篇:IEEE Fraud Detection Competition思路探索


下一篇:python常用语句if,for,while(如果每件事情都算来算去,那么等到想明白,可能就来不及做了。)