description:
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.
Notice
You can assume that there is at least one topological order in the graph.
Have you met this question in a real interview? Yes
Clarification
Learn more about representation of graphs
Example
For graph as follow:
picture
The topological order can be:
[0, 1, 2, 3, 4, 5]
[0, 2, 3, 1, 5, 4]
…
解题思路:拓扑排序是一种非常常考的问题,主要是维持indegree和outdegree,当indegree == 0 是说明该点是当前的起点。
(1)首先从所给定的graph中找到除起点外的所有点并确定indegree。
(2)建立queue,将起点放到queue中
(3)使用经典的bfs方法将该层的点一一找到,然后按照neighbors的方式将 indegree - 1,找到下一个indegree == 0的点
/**
* 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> result = new ArrayList<>();
HashMap<DirectedGraphNode, Integer> map = new HashMap<>();
Queue<DirectedGraphNode> queue = new LinkedList<>();
for (DirectedGraphNode node : graph) {
for (DirectedGraphNode neighbor : node.neighbors) {
if (map.containsKey(neighbor)) {
map.put(neighbor, map.get(neighbor) + 1);
} else {
map.put(neighbor, 1);
}
}
}
for (DirectedGraphNode node : graph) {
if (!map.containsKey(node)) {
queue.offer(node);
result.add(node);
}
}
while (!queue.isEmpty()) {
DirectedGraphNode node = queue.poll();
for (DirectedGraphNode neighbor : node.neighbors) {
if (map.containsKey(neighbor)) {
map.put(neighbor, map.get(neighbor) - 1);
if (map.get(neighbor) == 0) {
queue.offer(neighbor);
result.add(neighbor);
}
}
}
}
return result;
}
}