拓扑排序算法Kahn学习笔记

介绍

拓扑排序作用在有向无环图(Directed Acyclic Graph,简称DAG)上。

拓扑排序干了这样一件事情:如果图上有一条边 \(u \rightarrow v\),那么排序后 \(u\) 一定在 \(v\) 前。或说是在不破坏DAG内部的顺序的前提下,将DAG拉直成一条链。

比如说下面的图:

拓扑排序算法Kahn学习笔记

就是一个DAG。它的拓扑排序后的链是:3 4 2 1 5 (答案不唯一)

Kahn算法

Kahn算法用来求解一个DAG的拓扑排序。

步骤

  • 首先,先删除所有入度为 \(0\) 的点。如上图,就是 \(3\) 与 \(4\)。

  • 重复以上步骤直到图上所有点都被删除,删除的顺序就是拓扑排序的结果。

这个算法用到了一个定理:DAG删点时,整个图仍然是一个DAG。

参考代码如下:

By @totorato

void topo_sort(int lim, int ord[]){
	top = 0;
	int pos = 0;
   for(int i=1; i<=lim; i++)
		if(!ind[i])
			stk[++top] = i;
	while(top){
		int x = stk[top--];
		ord[++pos] = x;
		for(int i=fst[x]; i; i=nxt[i])
		{
			ind[v[i]]--;
			if(!ind[v[i]])
				stk[++top] = v[i];
		}
	}
}

鸣谢

参考资料:

上一篇:C++新特性


下一篇:笔记 - 强连通分量