其他分享
首页 > 其他分享> > OI loves Algorithm(一)——Toposort 之 Kahn

OI loves Algorithm(一)——Toposort 之 Kahn

作者:互联网

上次我更了一个叫做 OI loves Math 的东西,那么这次我们来更算法!
当然了,这种东西我遇到啥我就更啥……


先科普科普何谓拓扑排序。
拓扑排序指的是给你一个 DAG (Directed Acyclic Graph) ,让你排这些点,使得对于每条边 $ U \to V $ ,都存在 $ U \lt V $ 。


Kahn 算法的核心在于维护一个入度为 0 的 set 。
每次从 set 里取出一个元素,把它指向的边全部删掉。
在删的过程中,如果有一个点的入度为 0 了,那么把它加进 set 里。
还是很简单的吧?


在上代码之前,我会给大家一段伪代码,希望大家好好体会体会!

L <- toposort result
S <- the nodes with no income edges
while S is not empty
	U <- a random element from S
	delete U from S
	insert U to the end of L
	for all outcome edges (U, V)
		delete (U, V)
		if V has no income edge
			insert V to S

来了来了,上代码咯!

vector<int> L;
set<int> S;
int D[100005];

void toposort() {
	for (int U = 0; U < N; U++) {
		for (auto V : graph[U]) {
			D[V]++;
		}
	}
	for (int U = 0; U < N; U++) {
		if (D[U] == 0) {
			S.insert(U);
			no_in.push_back(U);
		}
	}
	while (S.size()) {
		int U = *S.begin();
		S.erase(U);
		L.push_back(U);
		for (auto V : graph[U]) {
			D[V]--;
			if (D[V] == 0) {
				S.insert(V);
			}
		}
	}
}

故事到此就结束了……?
错!
让我们分析分析这个算法到底是 DFS 还是 BFS!
如果我们每次都取新来的(即,用 stack 替换 set),那就是 DFS。
如果我们每次都取原先的(即,用 queue 替换 set),那就是 BFS。
而如果每次取最小的!

B D F S

(滑稽
所以,这种算法是介于 DFS 和 BFS 之间的遍历,我就欣赏这样的算法。

标签:Toposort,set,Algorithm,int,算法,DFS,BFS,++,Kahn
来源: https://www.cnblogs.com/AProblemSolver/p/16603509.html