lintcode:Topological Sorting
原创
©著作权归作者所有:来自51CTO博客作者mb63887cf57331d的原创作品,请联系作者获取转载授权,否则将追究法律责任
Given an directed graph, a topological order of the graph nodes is defined as follow:
For each directed edge A -> B in graph, A must before B in the order list.
The first node in the order can be any node in the graph with no nodes direct to it.
Find any topological order for the given graph.
1.DFS
需要注意的是这里的 DFS 不是纯 DFS,使用了 BFS 的思想进行了优化,否则一个节点将被遍历多次,时间复杂度可能恶化为指数级别。
废弃
比较难理解,且可以用队列存入度为0的点,
/**
* Definition for Directed graph.
* struct DirectedGraphNode {
* int label;
* vector<DirectedGraphNode *> neighbors;
* DirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
/**
* @param graph: A list of Directed graph node
* @return: Any topological order for the given graph.
*/
vector<DirectedGraphNode*> res;
void dfs(map<DirectedGraphNode*, int>& inDegree,DirectedGraphNode* node){
res.push_back(node);
inDegree[node]--;//让已经选过的为-1
vector<DirectedGraphNode*> neighbors=node->neighbors;
for(int j=0;j<neighbors.size();j++){
inDegree[neighbors[j]]--;
if(inDegree[neighbors[j]]==0){
dfs(inDegree,neighbors[j]);
}
}
}
vector<DirectedGraphNode*> topSort(vector<DirectedGraphNode*> graph) {
// write your code here
map<DirectedGraphNode*, int> inDegree;
for(int i=0;i<graph.size();i++){
DirectedGraphNode* node=graph[i];
inDegree[node]=0;
}
for(int i=0;i<graph.size();i++){
DirectedGraphNode* node=graph[i];
vector<DirectedGraphNode*> neighbors=node->neighbors;
for(int j=0;j<neighbors.size();j++){
inDegree[neighbors[j]]++;
}
}
for(int i=0;i<graph.size();i++){
DirectedGraphNode* node=graph[i];
if(inDegree[node]==0){
dfs(inDegree,node);
}
}
return res;
}
};