[算法板子] 求拓扑序列(拓扑排序)

前言 / 导言

拓扑排序有多种求法,可用DFSBFS求出,其中如果需要求出按字典序排列的拓扑序,则需要使用BFS将再将队列换为优先队列即可。

存图方法

邻接表(链式向前星结构)存图,每个点的入度为d数组

int head[M], ne[N], to[N], idx, d[M];
bool st[M];

void add ( int a, int b )
{
	d[b]++;		// b 的入度加 1
	to[idx] = b;
	ne[idx] = head[a];
	head[a] = idx++;
}

以下为拓扑排序的模板

模板一:优先队列法

优先队列中存的是点的编号

res容器中存的是最终答案

/* 邻接表(链式向前星)存图 */
void topsort ( int n, int m ) // 顶点数、边数
{
	vector<int> res;
	priority_queue<int, vector<int>, greater<int> > q;

	for ( int i = 1; i <= n; i++ )
	{
		if ( d[i] == 0 ) q.push ( i );
	}

	while ( !q.empty() )
	{
		int t = q.top(); q.pop();

		res.push_back ( t );				// 记录拓扑序

		for ( int i = head[t]; i != -1; i = ne[i] )
		{
			int b = to[i];
			if ( --d[b] == 0 ) q.push  ( b );
		}
	}
}

模板题:HDU1285

好题推荐:POJ1270

作者:Jude_Zhang
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用BY-NC-SA 许可协议。转载请注明出处!
支持博主:如果您觉得文章对您有帮助,可以点击文章下方赞一下。您的鼓励是博主的最大动力!
原文地址:https://www.cnblogs.com/judezhang/p/14659441.html