拓扑排序小记
来源:互联网 发布:手机淘宝首页热点 编辑:程序博客网 时间:2024/05/21 08:00
两种拓扑排序方法: dfs和bfs的。
先看bfs, 核心在于维护节点的剩余入度(这个词是自造的,因为入度不为0的节点的全部前继节点都被遍历过之后,该节点入度就变为0了)
每次搜索都把 剩余入度为0的节点 添加进拓扑序列末尾。 因为这个时候,他的前继节点已经都在拓扑序列中了。
剩余入度怎么维护?
首先搜索的起始点必定是入度为0的点,其他节点的剩余入度初始化为入度值。
每当节点A的剩余入度变为0的时候,A的所有后继节点剩余入度减一。 因为A的剩余入度为0,说明不可能再从A进入他的后继了。
queue<int> q;vector<int> topoSeq;for(int i=0; i<n; i++){if( predecessor[i] == 0) //入度为0 {q.push(i); }}int cur;while( !q.empty()){cur = q.front();topoSeq.push_back( cur ); //队列头 必然是入度为0的for (int i=0; i<n; i++) // 遍历后继{if( G[cur][i] < infinity ){--predecessor[i]; //节点i的前节点cur入度是0,已经不可能经过 cur再进入节点i了,所以节点i的入读需要减一 if (predecessor[i] == 0) // 节点i的最后一个未入口也访问完了,i已经没有前节点 {q.push(i); } } } q.pop();}
BFS的做法是从起点到终点构造出 拓扑序列的。
而DFS的做法,因为要到图的末尾才返回,那么构造拓扑序列则是从后往前的。
topologySort( topoSeq, Vertex, visited[]){ visited[ v ] = true; for (i=0; i< successor[v].size(); i++) { w = successor[v][ i ]; if( isvisited[w] == true ) continue; topologySort( topoSeq, w, visited ); } topoSeq.insertHead( v );}for( v=0; v<VertexCount; v++){ if ( visited[ v ] == false) topologySort(topoSeq, v, visited );}
0 0
- 拓扑排序小记
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 【拓扑排序】
- 拓扑排序
- 拓扑排序
- 拓扑排序
- Puzzle UVA
- leetcode
- 定时器中断
- PHP经典实例读书笔记(练习:日历)
- python关键字和非关键字参数(可变长参数)
- 拓扑排序小记
- Molar mass UVA
- 微信小程序中的swiper组件
- Java @Named的默认值为类名的首字母小写
- 蓝桥 奇怪的分式
- POJO、JavaBeans、EJB的区别
- All in All UVA
- C#网络编程初步之TCP
- 【TOP100】100个中国大数据应用最佳实践案例—为您打开万亿元大数据产业的财富之门