40分悬关QAQ
查看原帖
40分悬关QAQ
1180231
H_dream楼主2024/6/19 20:54
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5010,MOD=80112002;
int n,m,dp[N],a[N],ans;					//a[]---排序储存
struct node{
	int cnt;
	vector<int> v0,v1;				//v0---正向建边,v1---反向建边,cnt---入度
}v[N];
void bfs(){							//拓扑排序
	int tmp=0;
	queue<int> q;
	for(int i=1;i<=n;++i){
		if(v[i].cnt==0){
			dp[i]=1;
			q.push(i);
		}
	}
	while(!q.empty()){
		int x=q.front();
		q.pop();
		a[++tmp]=x;
		for(auto i:v[x].v0){
			v[i].cnt--;
			if(v[i].cnt==0) q.push(i);
		}
	}
	return ;
}
signed main(){
    cin>>n>>m;
    while(m--){
    	int x,y;
    	cin>>x>>y;
    	v[x].v0.push_back(y);
    	v[y].v1.push_back(x);
    	v[y].cnt++;
    }
    bfs();
    for(int i=1;i<=n;++i){							//问题所在
    	for(auto j:v[a[i]].v1)
    		dp[a[i]]+=dp[j];
    }
    /*
    for(int i=1;i<=n;++i) cout<<dp[i]<<' ';
    cout<<endl;
    */
    for(int i=1;i<=n;++i){
    	if(v[i].v0.empty()){
    		ans+=dp[i];
			ans%=MOD;
    	}
    }
    cout<<ans%MOD;
	return 0;
}
2024/6/19 20:54
加载中...