##P4017 最大食物链计数(拓扑排序和DFS)
起初用DFS总是出现内存越界,后来没办法了,用拓扑排序,其实之前根本不会拓扑排序,用了之后发现拓扑排序的时间复杂度为O(N+E),转念一想DFS+记忆不也是O(N+E)吗,在改掉一些冗余后两种代码都写了出来
####拓扑排序
#include<iostream>
#include<stack>
#include<cstdio>
using namespace std;
int M=80112002;
int EA[5005]={0},EB[5005]={0};
int D[5005]={0};
struct A{
int eb[5005];
int na=0;
int nb=0;
}P[5005];
int main(){
int n,m,x,y,sum=0;
stack<int> S;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d",&x,&y);
P[x].eb[P[x].nb++]=y;
P[y].na++;
}
for(int i=1;i<=n;i++){
if(P[i].na==0){
S.push(i);
D[i]=1;
}
}
while(S.size()!=0){
int v=S.top();
S.pop();
if(P[v].nb==0){
sum+=D[v];
sum%=M;
}
for(int i=0;i<P[v].nb;i++){
D[P[v].eb[i]]+=D[v];
D[P[v].eb[i]]%=M;
P[P[v].eb[i]].na--;
if(P[P[v].eb[i]].na==0){
S.push(P[v].eb[i]);
}
}
}
cout<<sum;
return 0;
}
####DFS
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int M=80112002;
int D[5005]={0};
struct A{
int eb[5005];
int na=0;
int nb=0;
}P[5005];
int dbs(int x){
if(D[x]!=0){
return D[x];
}
if(P[x].nb==0){
D[x]=1;
return D[x];
}
long long sum=0;
for(int i=0;i<P[x].nb;i++){
sum+=dbs(P[x].eb[i]);
}
D[x]=sum%M;
return D[x];
}
int main(){
int n,m,x,y;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d",&x,&y);
P[x].eb[P[x].nb++]=y;
P[y].na++;
}
long long sum=0;
for(int i=1;i<=n;i++){
if(P[i].na==0&&P[i].nb==0){
D[i]=1;
sum+=1;
}else if(P[i].na==0){
sum+=dbs(i);
}
}
sum%=M;
printf("%lld",sum);
return 0;
}