给定一个有向图,图节点的拓扑排序被定义为:
•对于每条有向边A--> B,则A必须排在B之前
•拓扑排序的第一个节点可以是任何在图中没有其他节点指向它的节点
找到给定图的任一拓扑排序
您在真实的面试中是否遇到过这个题?
Yes
样例
对于下列图:
这个图的拓扑排序可能是:
[0, 1, 2, 3, 4, 5]
或者
[0, 2, 3, 1, 5, 4]
或者
....
注意
你可以假设图中至少存在一种拓扑排序
挑战
能否分别用BFS和DFS完成?
标签 Expand
•对于每条有向边A--> B,则A必须排在B之前
•拓扑排序的第一个节点可以是任何在图中没有其他节点指向它的节点
找到给定图的任一拓扑排序
您在真实的面试中是否遇到过这个题?
Yes
样例
对于下列图:
这个图的拓扑排序可能是:
[0, 1, 2, 3, 4, 5]
或者
[0, 2, 3, 1, 5, 4]
或者
....
注意
你可以假设图中至少存在一种拓扑排序
挑战
能否分别用BFS和DFS完成?
标签 Expand
解题思路:
用一个map<node,set<node>> 其中node表示的是该节点,set表示指向node的节点
1.在图中找到一个符合拓扑排序的第一个节点的条件的节点,减去该节点以及该节点所有的路径
2.循环1直至没有节点存在了。
/**
* Definition for Directed graph.
* class DirectedGraphNode {
* int label;
* ArrayList<DirectedGraphNode> neighbors;
* DirectedGraphNode(int x) { label = x; neighbors = new ArrayList<DirectedGraphNode>(); }
* };
*/
public class Solution {
/**
* @param graph: A list of Directed graph node
* @return: Any topological order for the given graph.
*/
public ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {
// write your code here
ArrayList<DirectedGraphNode> res = new ArrayList<>();
if(0==graph.size()||null==graph)
return res;
HashMap<DirectedGraphNode, HashSet<DirectedGraphNode> > map = new HashMap<>();
for(DirectedGraphNode node:graph){
HashSet<DirectedGraphNode> direcSet= new HashSet<>();
map.put(node,direcSet);
}
for(DirectedGraphNode node:graph){
for(DirectedGraphNode nb:node.neighbors)
map.get(nb).add(node);
}
while(graph.size()>0){
for(int i=0;i<graph.size();i++){
DirectedGraphNode tmp = graph.get(i);
if(map.get(tmp).size()==0){
res.add(tmp);
graph.remove(tmp);
for(DirectedGraphNode leave:graph){
if(map.get(leave).contains(tmp))
map.get(leave).remove(tmp);
}
}
}
}
return res;
}
}