P4017 最大食物链计数(拓扑排序)
题目是找生产者到最高级消费者的路线有几条。
其实是找入度为0的点到出度为0的路径方式有几种。
预处理入度和出度,拓扑排序,把出度为0的点的路线累加。
#include<iostream> #include<algorithm> #include<cstdio> #include<vector> #include<queue> #include<map> #include<string.h> using namespace std; typedef long long int ll; int n,k,m,b,t,t1,t2,t3,maxx=0; const int maxn=1e5+5; const int mod= 80112002; vector<int >v[maxn]; vector<int>a(maxn); queue<int>q; int indge[maxn]; int outdge[maxn]; void topsort() { int num=0; while(!q.empty())q.pop(); for(int i=1;i<=n;i++){ if(!indge[i]){ a[i]=1; q.push(i); } } while(!q.empty()){ int tot=q.front(); q.pop(); num++; for(int i=0;i<v[tot].size();i++){ if(--indge[v[tot][i]]==0){ q.push(v[tot][i]); } a[v[tot][i]]=(a[v[tot][i]]+a[tot])%mod; } } } int main() { scanf("%d%d",&n,&m); for(int i=0;i<maxn;i++)v[i].clear();a.clear(); memset(indge,0,sizeof(indge)); memset(outdge,0,sizeof(outdge)); for(int j=0;j<m;j++){ //cin>>t1>>t2>>t3; scanf("%d%d",&t1,&t2); v[t1].push_back(t2); indge[t2]++; outdge[t1]++; } topsort(); int ans=0; for(int i=1;i<=n;i++){ if(outdge[i]==0)ans=(ans+a[i])%mod; } cout<<ans<<endl; return 0; }