拓扑序列

拓扑序列

如果存在环,则一定不存在拓扑序列,有向无环图一定存在拓扑序列,所以有向无环图被称为拓扑图
一个有向无环图一定至少存在一个入度为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;
}

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注