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