1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| package bbm.graph;
import java.util.Arrays; import java.util.LinkedList; import java.util.List;
import static bbm.graph.TopologicalOrder.Color.GRAY; import static bbm.graph.TopologicalOrder.Color.WHITE;
public class TopologicalOrder { public static class Node { String name; Color color = WHITE; int startTime; int endTime; Node pre = null; List<Node> next = new LinkedList<>();
public Node(String name) { this.name = name; } }
public static enum Color { WHITE, GRAY, BLACK }
public static int time = 0;
public static void dfs(List<Node> graph) { graph.forEach(node -> { if (node.color.equals(WHITE)) { visit(node); } }); }
private static void visit(Node node) { time += 1; node.startTime = time; node.color = GRAY; node.next.forEach(neighbor -> { if (neighbor.color.equals(WHITE)) { neighbor.pre = node; visit(neighbor); } }); node.color = Color.BLACK; time += 1; node.endTime = time; }
public static void topologicalSort(List<Node> nodes) { dfs(nodes); nodes.sort((o1, o2) -> o2.endTime - o1.endTime); for (Node node : nodes) { System.out.print(node.name + " "); } }
public static void main(String[] args) { Node w = new Node("袜子"); Node n = new Node("内裤"); Node k = new Node("裤子"); Node x = new Node("鞋子"); Node s = new Node("手表"); Node c = new Node("衬衣"); Node y = new Node("腰带"); Node l = new Node("领带"); Node j = new Node("夹克"); w.next.add(x); n.next.addAll(Arrays.asList(k, x)); k.next.addAll(Arrays.asList(x, y)); c.next.addAll(Arrays.asList(y, l)); y.next.add(j); l.next.add(j); List<Node> nodes = Arrays.asList(w, n, k, x, s, c, y, l, j); topologicalSort(nodes); } }
|