萌新刚学拓扑排序,80分求助
查看原帖
萌新刚学拓扑排序,80分求助
376467
QDHSLGYYJK楼主2021/1/18 23:26
#include<cstdio>
#include<queue>
using namespace std;
const int N=5000,M=500000,P=80112002;
int h[N],nxt[M],v[M],ind[M],otd[M],cnt[N],len,ans;//ind为入度,otd为出度 
int n,m;
queue<int> q;
template<typename T>
void read(T &x){
	x=0;
	int f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9'){
		if (ch=='-')
			f=-1;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	x*=f;
}
template<typename T>
void write(T x){
	if (x<0){
		x=-x;
		putchar('-');
	}
	if (x>9)
		write(x/10);
	putchar(x%10+'0');
}
void add(int x,int y){
	v[++len]=y;
	nxt[len]=h[x];
	h[x]=len;
	++ind[y];
	++otd[x];
}
int main(){
//	freopen("P4017_9.in.txt","r",stdin);
	int x,y;
	read(n);read(m);
	for (int i=1;i<=m;++i){
		read(x);read(y);
		add(x,y);
	}
	for (int i=1;i<=n;++i)
		if (!ind[i]){
			cnt[i]=1;
			q.push(i);
		}
	while (!q.empty()){
		int t=q.front();
		q.pop();
		for (int i=h[t];i;i=nxt[i]){
			--ind[v[i]];
			cnt[v[i]]=(cnt[v[i]]+cnt[t])%P;
			if (!ind[v[i]]){
				if (otd[v[i]])
					q.push(v[i]);
				else
					ans=(ans+cnt[v[i]])%P;
			}
		}
	}
	write(ans);
//	fclose(stdin);
	return 0;
}

第九个点第十个点始终过不去。

2021/1/18 23:26
加载中...