From f89dea02b90b35489b654f63e68088950bb5d156 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B7=A6=E7=A8=8B=E4=BA=91?= Date: Thu, 24 Dec 2020 11:44:13 +0800 Subject: [PATCH] modify code --- ....java => Code03_TopologicalOrderDFS1.java} | 2 +- src/class10/Code03_TopologicalOrderDFS2.java | 70 +++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) rename src/class10/{Code03_TopologicalOrderDFS.java => Code03_TopologicalOrderDFS1.java} (97%) create mode 100644 src/class10/Code03_TopologicalOrderDFS2.java diff --git a/src/class10/Code03_TopologicalOrderDFS.java b/src/class10/Code03_TopologicalOrderDFS1.java similarity index 97% rename from src/class10/Code03_TopologicalOrderDFS.java rename to src/class10/Code03_TopologicalOrderDFS1.java index d15fbe6..9514606 100644 --- a/src/class10/Code03_TopologicalOrderDFS.java +++ b/src/class10/Code03_TopologicalOrderDFS1.java @@ -5,7 +5,7 @@ import java.util.Comparator; import java.util.HashMap; // OJ链接:https://www.lintcode.com/problem/topological-sorting -public class Code03_TopologicalOrderDFS { +public class Code03_TopologicalOrderDFS1 { // 不要提交这个类 public static class DirectedGraphNode { diff --git a/src/class10/Code03_TopologicalOrderDFS2.java b/src/class10/Code03_TopologicalOrderDFS2.java new file mode 100644 index 0000000..7cf5f79 --- /dev/null +++ b/src/class10/Code03_TopologicalOrderDFS2.java @@ -0,0 +1,70 @@ +package class10; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; + +// OJ链接:https://www.lintcode.com/problem/topological-sorting +public class Code03_TopologicalOrderDFS2 { + + // 不要提交这个类 + public static class DirectedGraphNode { + public int label; + public ArrayList neighbors; + + public DirectedGraphNode(int x) { + label = x; + neighbors = new ArrayList(); + } + } + + // 提交下面的 + public static class Record { + public DirectedGraphNode node; + public long nodes; + + public Record(DirectedGraphNode n, long o) { + node = n; + nodes = o; + } + } + + public static class MyComparator implements Comparator { + + @Override + public int compare(Record o1, Record o2) { + return o1.nodes == o2.nodes ? 0 : (o1.nodes > o2.nodes ? -1 : 1); + } + } + + public static ArrayList topSort(ArrayList graph) { + HashMap order = new HashMap<>(); + for (DirectedGraphNode cur : graph) { + f(cur, order); + } + ArrayList recordArr = new ArrayList<>(); + for (Record r : order.values()) { + recordArr.add(r); + } + recordArr.sort(new MyComparator()); + ArrayList ans = new ArrayList(); + for (Record r : recordArr) { + ans.add(r.node); + } + return ans; + } + + public static Record f(DirectedGraphNode cur, HashMap order) { + if (order.containsKey(cur)) { + return order.get(cur); + } + long nodes = 0; + for (DirectedGraphNode next : cur.neighbors) { + nodes += f(next, order).nodes; + } + Record ans = new Record(cur, nodes + 1); + order.put(cur, ans); + return ans; + } + +}