搜索40分,6WA求助
查看原帖
搜索40分,6WA求助
313967
ditffit楼主2020/11/5 21:40

想法: 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个点,思路有什么问题吗,求助

2020/11/5 21:40
加载中...