拓扑排序(topological sort)DFS
来源:互联网 发布:nginx linux内核优化 编辑:程序博客网 时间:2024/05/17 22:16
对上图进行拓扑排序的结果:
8->7->2->3->0->6->9->10->11->12->1->5->4
使用dfs进行拓扑排序同样摘录一段维基百科上的伪码:
L ← Empty list that will contain the sorted nodes
S ← Set of all nodes with no outgoing edges
for each node n in S do
visit(n)
function visit(node n)
if n has not been visited yet then
mark n as visited
for each node m with an edgefrom m to ndo
visit(m)
add n to L
DFS的实现更加简单直观,使用递归实现。利用DFS实现拓扑排序,实际上只需要添加一行代码,即上面伪码中的最后一行:add n to L。
需要注意的是,将顶点添加到结果List中的时机是在visit方法即将退出之时。
这个算法的实现非常简单,但是要理解的话就相对复杂一点。
关键在于为什么在visit方法的最后将该顶点添加到一个集合中,就能保证这个集合就是拓扑排序的结果呢?
因为添加顶点到集合中的时机是在dfs方法即将退出之时,而dfs方法本身是个递归方法,只要当前顶点还存在边指向其它任何顶点,它就会递归调用dfs方法,而不会退出。因此,退出dfs方法,意味着当前顶点没有指向其它顶点的边了,即当前顶点是一条路径上的最后一个顶点。
下面简单证明一下它的正确性:
考虑任意的边v->w,当调用dfs(v)的时候,有如下三种情况:
dfs(w)还没有被调用,即w还没有被mark,此时会调用dfs(w),然后当dfs(w)返回之后,dfs(v)才会返回
dfs(w)已经被调用并返回了,即w已经被mark
dfs(w)已经被调用但是在此时调用dfs(v)的时候还未返回
需要注意的是,以上第三种情况在拓扑排序的场景下是不可能发生的,因为如果情况3是合法的话,就表示存在一条由w到v的路径。而现在我们的前提条件是由v到w有一条边,这就导致我们的图中存在环路,从而该图就不是一个有向无环图(DAG),而我们已经知道,非有向无环图是不能被拓扑排序的。
那么考虑前两种情况,无论是情况1还是情况2,w都会先于v被添加到结果列表中。所以边v->w总是由结果集中后出现的顶点指向先出现的顶点。为了让结果更自然一些,可以使用栈来作为存储最终结果的数据结构,从而能够保证边v->w总是由结果集中先出现的顶点指向后出现的顶点。
来自于http://blog.csdn.net/dm_vincent/article/details/7714519
附上我的dfs代码 uva10305
#include<bits/stdc++.h>using namespace std;const int maxn=1100;int c[maxn];bool G[maxn][maxn];int topo[maxn],t,n,m,x,y;bool dfs(int u){ c[u]=-1;//访问标志-1正在访问,1已经访问,0尚未访问 for(int v=0; v<n; v++) if(G[u][v]) { if(c[v]<0) return false;//存在环路 else if(!c[v]&&!dfs(v)) return false; } c[u]=1; topo[--t]=u; return true;}bool toposort(){ t=n; memset(c,0,sizeof(c)); for(int u=0; u<n; u++) if(!c[u]&&!dfs(u)) return false; return true;}int main(){ while(cin>>n>>m&&n) { memset(G,0,sizeof(G)); while(m--) { cin>>x>>y; G[x-1][y-1]=1; } if(toposort()) for(int i=0; i<n; i++) cout<<topo[i]+1<<(i==n-1?"\n":" "); else cout<<"This is not a DAG!"<<endl; } return 0;}
- 拓扑排序(topological sort)DFS
- 拓扑排序(Topological Sort)
- 拓扑排序(Topological Sort)
- 拓扑排序(topological-sort)
- 拓扑排序(topological sort)
- 拓扑排序(topological sort)
- 拓扑排序(Topological Sort)
- topological-sort(拓扑排序)
- Topological Sort-拓扑排序
- 拓扑排序(Topological Sort)
- 拓扑排序 Topological-sort
- 拓扑排序 - Topological Sort
- Topological Sort拓扑排序
- DSOJ Topological Sort(拓扑排序)
- 拓扑排序学习(Topological Sort)
- 图论算法:拓扑排序(Topological Sort)
- pta ——Topological Sort(拓扑排序)
- 有关Topological-sort(拓扑排序)的belabela...
- 南邮 OJ 1913 闹钟
- JavaScript中setInterval函数应用常见问题之一(第一个参数不加引号与加引号的区别)
- hdoj 5033 凸包
- Handler、Looper、MessageQueue(三)
- DevExpress v15.1:TestCafe功能升级
- 拓扑排序(topological sort)DFS
- 南邮 OJ 1914 小明与小红
- linux下的NetworkManager服务,解决service network restart 闲置网卡报错问题
- Oracle VM VirtualBox VBoxDD.Dll GetLastError=1790 错误处理方法
- Linux系统命令及Shell脚本学习笔记一:Linux简介
- MySQL触发器、存储过程、自定义函数、视图 常用SQL
- iOS私有API之wifi扫描和wifi连接
- HDU1.3.8 As Easy As A+B
- 南邮 OJ 1916 贲神的故事2