Ja, Sie können topologische Sortierung mit BFS durchführen. Eigentlich erinnerte ich mich, als mein Lehrer mir sagte, dass, wenn das Problem durch BFS gelöst werden kann, nie wählen, es durch DFS zu lösen. Weil die Logik für BFS einfacher als DFS ist, werden Sie die meiste Zeit immer eine einfache Lösung für ein Problem wünschen.
Wie YvesgereY und IVlad erwähnt, müssen Sie mit Knoten, von denen die indegree ist , dh keine anderen Knoten leiten, um sie zu starten. Stellen Sie sicher, dass Sie diese Knoten zuerst zu Ihrem Ergebnis hinzufügen. Sie können eine HashMap verwenden, um jeden Knoten mit seiner Unabhängigkeit und einer Warteschlange, die sehr häufig in BFS angezeigt wird, um Ihre Traversierung zu unterstützen, verwenden. Wenn Sie einen Knoten aus der Warteschlange abfragen, muss der Abstand seiner Nachbarn um 1 verringert werden. Dies ist wie Löschen des Knotens aus dem Diagramm und Löschen der Kante zwischen dem Knoten und seinen Nachbarn. Jedes Mal, wenn Sie Knoten mit 0 indegree finden, bieten Sie sie der Warteschlange an, um später ihre Nachbarn zu überprüfen und sie zum Ergebnis hinzuzufügen.
public ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {
ArrayList<DirectedGraphNode> result = new ArrayList<>();
if (graph == null || graph.size() == 0) {
return result;
}
Map<DirectedGraphNode, Integer> indegree = new HashMap<DirectedGraphNode, Integer>();
Queue<DirectedGraphNode> queue = new LinkedList<DirectedGraphNode>();
//mapping node to its indegree to the HashMap, however these nodes
//have to be directed to by one other node, nodes whose indegree == 0
//would not be mapped.
for (DirectedGraphNode DAGNode : graph){
for (DirectedGraphNode nei : DAGNode.neighbors){
if(indegree.containsKey(nei)){
indegree.put(nei, indegree.get(nei) + 1);
} else {
indegree.put(nei, 1);
}
}
}
//find all nodes with indegree == 0. They should be at starting positon in the result
for (DirectedGraphNode GraphNode : graph) {
if (!indegree.containsKey(GraphNode)){
queue.offer(GraphNode);
result.add(GraphNode);
}
}
//everytime we poll out a node from the queue, it means we delete it from the
//graph, we will minus its neighbors indegree by one, this is the same meaning
//as we delete the edge from the node to its neighbors.
while (!queue.isEmpty()) {
DirectedGraphNode temp = queue.poll();
for (DirectedGraphNode neighbor : temp.neighbors){
indegree.put(neighbor, indegree.get(neighbor) - 1);
if (indegree.get(neighbor) == 0){
result.add(neighbor);
queue.offer(neighbor);
}
}
}
return result;
}
Ja, es kann getan werden. https://www.quora.com/Can-topological-sorting-be-done-using-BFS –