标签:Toposort set Algorithm int 算法 DFS BFS ++ 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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。