LintCode_拓扑排序_DFS实现
来源:互联网 发布:国动网络集团是国企吗 编辑:程序博客网 时间:2024/06/04 18:51
给定一个有向图,图节点的拓扑排序被定义为:
- 对于每条有向边A--> B,则A必须排在B之前
- 拓扑排序的第一个节点可以是任何在图中没有其他节点指向它的节点
找到给定图的任一拓扑排序
注意事项
你可以假设图中至少存在一种拓扑排序
说明
Learn more about representation of graphs
样例
对于下列图:
这个图的拓扑排序可能是:
[0, 1, 2, 3, 4, 5]
或者
[0, 2, 3, 1, 5, 4]
或者
....
下面用递归思想和深度优先搜索实现拓扑排序的算法。
#include <algorithm>using namespace std;/** * Definition for Directed graph. * struct DirectedGraphNode { * int label; * vector<DirectedGraphNode *> neighbors; * DirectedGraphNode(int x) : label(x) {}; * }; */const int MAX=99999;class Solution {public: /** * @param graph: A list of Directed graph node * @return: Any topological order for the given graph. */ bool Visited[MAX]; //标记是否被访问过 vector<DirectedGraphNode*> result; void dfs(DirectedGraphNode* r) { Visited[r->label]=true; //标记已经访问过 for(int i=0;i<r->neighbors.size();i++) //遍历所有的邻居 { if(!Visited[r->neighbors[i]->label]) //如果邻居没有被访问过,则深入访问 dfs(r->neighbors[i]); } result.push_back(r); //将访问结束的顶点添加到vecotr } vector<DirectedGraphNode*> topSort(vector<DirectedGraphNode*> graph) { for(int i=0;i<graph.size();i++) if(!Visited[graph[i]->label]) dfs(graph[i]); reverse(result.begin(),result.end()); //记得逆向 return result; }};
阅读全文
1 0
- LintCode_拓扑排序_DFS实现
- LintCode_拓扑排序_BFS实现
- lintcode_整数排序 II
- 拓扑排序 C++实现
- 拓扑排序 C++实现
- 拓扑排序 C实现
- 拓扑排序代码实现
- 拓扑排序实现
- 拓扑排序 C++实现
- 拓扑排序c++实现
- JAVA实现拓扑排序
- 拓扑排序C++实现
- 拓扑排序 JAVA实现
- 拓扑排序算法实现
- javascript实现拓扑排序
- 拓扑排序-简单实现
- 拓扑排序算法(C++实现)
- 拓扑排序算法(C++实现)
- 记忆化搜索
- 1.1.7 if语句
- swiper在进行动态数据加载时的应用和处理
- Atom 如何去掉右侧竖线
- 欢迎使用CSDN-markdown编辑器
- LintCode_拓扑排序_DFS实现
- Power oj 2540 (FFT卷积)
- java 数组 、 for each循环, 数组的两种拷贝方法 ,Arrays.copyOf(),Arrays.toString[],匿名数组
- LeetCode-Easy-Java-Implement strStr()
- HTML&CSS高级05-07(选择器)
- C语言库函数(strcpy、strncpy、memcpy、memset)
- JS 页面加载触发事件 document.ready和onload的区别
- Linux系统优化
- 最短路径问题 变异Dijkstra