求助 #4 #5 TLE
查看原帖
求助 #4 #5 TLE
341654
DWDWDWDW楼主2021/1/31 16:56

RT,拓扑排序+邻接表

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int N = 200000+10 ,M=100000+10;

int n,m,e[N],ne[N],h[N],idx,d[M],cnt,sum,book[M],dis[M];

inline int read(){
    int f=1,x=0; char ch;
    do{ch=getchar();if(ch=='-')f=-1;} while(ch<'0'||ch>'9');
    do{x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} while(ch>='0'&&ch<='9');
    return f*x;
}

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

inline void topsort(){
	int que[M],head=1,tail=2;
	for(int i=1;i<=n;i++){
		if(!d[i]){
			que[tail]=i;
			tail++;
		}
	}
	while(head<tail){
		int t=que[head];
		head++;
		for(int i=h[t];i!=-1;i=ne[i]){
			int j=e[i];
			if(--d[j]==0){
				que[tail]=j;
				tail++;
				dis[j]=dis[t]+1;
			}
		}
	}
	return ;
}

int main(){
	memset(h,-1,sizeof h);
	n=read(),m=read();
	for(int i=1;i<=m;i++){
		int x,y;
		x=read(),y=read();
		add(x,y);
		d[y]++;
	}
	for(int i=1;i<=n;i++){
		topsort();
		printf("%d\n",dis[i]+1);
	}
	return 0;
}
2021/1/31 16:56
加载中...