想法:
1.只找入度为0的,开搜
2.搜的过程中再碰到(更新后)入度为0的,从这个点再搜
3.结束,输出答案
#include<iostream>
#define re register
#define oo -100001
using namespace std;
const int inf=500004;//边数 max
const int dif=5003;//点数 max
const int mod=80112002;
int a,b,n,m,cnt=0;
long long ans=0;
int h[dif],f[dif],in[dif],to[dif];
struct Edge{
int next,to;
} e[inf];
inline void add(int u,int v){
e[++cnt].next=h[u];
e[cnt].to=v;
h[u]=cnt;
}
void dfs(int x){
if(to[x]==0){
ans=(f[x]+ans)%mod; return ;
}//如果到了终点 更新答案
for(re int i=h[x];i;i=e[i].next){//搜边
// to[x]--;//原点的出度减 1 加了会全 WA
f[e[i].to]=(f[x]+f[e[i].to])%mod;
//把这个点的答案累计到下一个点
if(--in[e[i].to]==0)
dfs(e[i].to);//...
}
return ;
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>m;
for(re int i=1;i<=m;i++){
cin>>a>>b;
add(a,b);
to[a]++; in[b]++;
}
for(re int i=1;i<=n;i++)
if(in[i]==0) f[i]=1;
for(re int i=1;i<=n;i++)
if(in[i]==0) dfs(i);
cout<<ans%mod;
return 0;
}
结果只对了前4个点,思路有什么问题吗,求助