Evet, BFS kullanarak topolojik sıralama yapabilirsiniz. Aslında, bir keresinde öğretmenimin bana sorunun BFS tarafından çözülebileceğini söylemesi durumunda, bunu asla DFS ile çözmeyi seçmediğimi hatırlıyorum. Çünkü BFS mantığı DFS'dan daha basit olduğundan, çoğu zaman bir problem için basit bir çözüm isteyeceksiniz. YvesgereY ve IVlad değindiği gibi
, başka hiçbir düğümleri kendilerine doğrudan anlam alıcılık olduğu düğümlerle başlamak gerekir. Bu düğümleri önce sonuca eklediğinizden emin olun. Her düğümü kendi mutluluğu ile eşleştirmek için bir HashMap'i ve geçişinize yardımcı olmak için BFS'de sıkça görülen bir sıra kullanabilirsiniz. Kuyruktan bir düğümü sorguladığınızda, komşularının bağımsızlığı 1 tarafından azaltılmalı, bu, düğümü grafikten silmek ve düğüm ile komşuları arasındaki kenarı silmek gibidir. Her defasında düğümleri 0 bağımsızlığıyla karşılaştığınızda, komşularını daha sonra kontrol etmek için sıraya sunun ve sonuçlara ekleyin.
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;
}
Evet, bu yapılabilir. https://www.quora.com/Can-topological-sorting-be-done-using-BFS –