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的点,详见http://blog.csdn.net/gao1440156051/article/details/51546892
/**
* 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;
}
};