拓扑序列

拓扑序列

  • 如果存在环,则一定不存在拓扑序列,有向无环图一定存在拓扑序列,所以有向无环图被称为拓扑图
  • 一个有向无环图一定至少存在一个入度为0的点
  • 有向图中每个点的入度(有几条边指向它) 出度(它指出几条边)
  • 用BFS实现
const int N = 1e5+10;
int head[N],e[2*N],ne[2*N],idx = 0;
int n,m;
//手写队列
int q[N];
//入度
int indegree[N];
void init()
{
	memset(head,-1,sizeof(head));
	idx = 0;	
}
void add(int a,int b)
{
	e[idx] = b;
	ne[idx] = head[a];
	head[a] = idx;
	idx ++;
}
bool topsort()
{
	int hh = 0, tt = -1;
	//把所有入度为0的点入队
	for(int i=1;i<=n;i++)
		if(!indegree[i])
			q[++ tt] = i;

	while(hh <= tt)
	{
		int t = q[hh ++];
		for(int i = head[t]; i != -1; i = ne[i])
		{
			int j = e[i];
			indegree[j] -- ;
			if(indegree[j] == 0)	q[++ tt] = j;
		}
	}
	
	return tt == n - 1;
}
int main()
{
	cin>>n>>m;
	init();
	for(int i = 0;i < m; i ++)
	{
		int a,b;
		cin>>a>>b;
		add(a,b);
		indegree[b] ++ ;
	}
	if(topsort())
	{
		for(int i = 0; i < n; i++) cout<<q[i]<<' ';
		cout<<endl;
	}
	else puts("-1");
	return 0;
}
原文地址:https://www.cnblogs.com/codertea/p/12803216.html