拓扑排序
(1)仅针对有向无环图;
(2)图的拓扑排序不唯一,只需保证各节点在图上的原始顺序保持不变;
(3)实现(可借助辅助队列或栈,时间复杂度为O(|E|+|V|));
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
class CycleFoundException extends Exception {}
public class Test {
public static class GrapNode {
public String name;
public int indegree = 0;
public List<GrapNode> neighbors = new ArrayList<GrapNode>();
GrapNode(String name) {
this.name = name;
}
public void addNeighbors(GrapNode... nodes) {
for(GrapNode node : nodes) {
node.indegree++;
neighbors.add(node);
}
}
}
public static List<String> topSort(GrapNode... grap) throws CycleFoundException{
Queue<GrapNode> queue = new LinkedList<GrapNode>();
List<String> sorted = new ArrayList<String>();
for(GrapNode node : grap) {
if(node.indegree == 0)
queue.add(node);
}
while(!queue.isEmpty()) {
GrapNode node = queue.remove();
sorted.add(node.name);
for(GrapNode n : node.neighbors) {
if(--n.indegree == 0)
queue.add(n);
}
}
if(sorted.size() < grap.length)
throw new CycleFoundException();
return sorted;
}
public static void main(String[] args) {
GrapNode v1 = new GrapNode("v1");
GrapNode v2 = new GrapNode("v2");
GrapNode v3 = new GrapNode("v3");
GrapNode v4 = new GrapNode("v4");
GrapNode v5 = new GrapNode("v5");
GrapNode v6 = new GrapNode("v6");
GrapNode v7 = new GrapNode("v7");
v1.addNeighbors(v2,v3,v4);
v2.addNeighbors(v4,v5);
v3.addNeighbors(v6);
v4.addNeighbors(v3,v6,v7);
v5.addNeighbors(v4,v7);
v7.addNeighbors(v6);
try {
List<String> sorted = topSort(v1,v2,v3,v4,v5,v6,v7);
for(String s : sorted) {
System.out.print(s+", ");
}
} catch (CycleFoundException e) {
e.printStackTrace();
}
}
}/*output:
v1, v2, v5, v4, v3, v7, v6,
*///:~