全wa 看不出哪里错了 topsort
查看原帖
全wa 看不出哪里错了 topsort
851870
zbk_ning楼主2023/12/13 11:51
#include<bits/stdc++.h>
using namespace std;



const int N = 500010;
const int mod=80112002;
int e[N], ne[N], idx;//邻接表存储图
int h[N],in[N],out[N];
int num[N];

int n, m;//保存图的点数和边数


//topsort
//记录每个点的入读
//将入度为0的点放入队列
//将队列的点出队 删除从该点发出的所有边 同时便另一侧的点入读-1
//如果所有点都进过队列 则可以topsort 输出所有顶点 

//记录每个点入度出度
//记录到达每个点路径数
//如果出度为0即到达终点 输出答案 


void add(int a,int b){
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx;
	idx++;
}


void topsort(){
	queue<int> q;
	for(int i=1;i<=n;i++){
		if(in[i]==0){
			q.push(i);
			num[i]=1;
		}
	}
	
	while(q.size()){
		int t=q.front();
		q.pop();
		for(int i=h[t];i!=-1;i=ne[i]){
			int j=e[i];
			in[j]--;
			num[j]=(num[j]+num[t])%mod;
			if(in[j]==0) q.push(j);
		}
	}
}

int main(){
	cin>>n>>m;
	memset(h,-1,sizeof h);
	for(int i=1;i<=m;i++){
		int a,b;
		cin>>a>>b;
		add(a,b);
		out[a]++;
		in[b]++;
	}
	topsort();
	int ans;
	for(int i=1;i<=n;i++){
		if(out[i]==0){
			ans=(ans+num[i])%mod;
		}
	}
	cout<<ans;
}








2023/12/13 11:51
加载中...