有向图的拓扑排序

有向图的拓扑排序

![在这里插入图片描述]( https://img-blog.csdnimg.cn/20210518201536181.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MzAzNzM3OQ==,size_16,color_FFFFFF,t_70)

输入样例:

3 3
1 2
2 3
1 3

输出样例:

1 2 3

模板:

//有向图拓扑序列 
//拓扑序 有向无环图一定存在图谱序列
//入度 出度
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 100010;
int n,m;
int h[N],e[N],ne[N],idx;
int q[N],d[N];
void add(int a,int b){
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
}
bool topsort(){
	int hh=0,tt=-1;
	for(int i=1;i<=n;i++){
		if(!d[i])
		    q[++tt]=i;
	}
	while(hh<=tt){
		int t=q[hh++];
		
		for(int i=h[t];i!=-1;i=ne[i]){   //核心 
			int j=e[i];
			d[j]--;
			if(d[j]==0) q[++tt]=j;
		}
	}
	 cout<<"tt= "<<tt<<endl;
	return tt==n-1;
}
int main(){
	cin>>n>>m;
	memset(h,-1,sizeof h);
	
	for(int i=0;i<m;i++){
		int a,b;
		cin>>a>>b;
		add(a,b);
		d[b]++;
	}
	if(topsort()){
		for(int i=0;i<n;i++) printf("%d ",q[i]);
		puts("");
	}else{
		puts("-1");
	}
	return 0;
} 

 

posted @ 2022-03-22 01:04  panse·  阅读(125)  评论(0)    收藏  举报