modify code

pull/6/head
左程云 4 years ago
parent f89dea02b9
commit 8e8b7abbf3

@ -10,20 +10,14 @@ public class Code03_TopologySort {
// directed graph and no loop // directed graph and no loop
public static List<Node> sortedTopology(Graph graph) { public static List<Node> sortedTopology(Graph graph) {
// key某一个node
// value剩余的入度
HashMap<Node, Integer> inMap = new HashMap<>(); HashMap<Node, Integer> inMap = new HashMap<>();
// 剩余入度为0的点才能进这个队列
Queue<Node> zeroInQueue = new LinkedList<>(); Queue<Node> zeroInQueue = new LinkedList<>();
for (Node node : graph.nodes.values()) { for (Node node : graph.nodes.values()) {
inMap.put(node, node.in); inMap.put(node, node.in);
if (node.in == 0) { if (node.in == 0) {
zeroInQueue.add(node); zeroInQueue.add(node);
} }
} }
// 拓扑排序的结果依次加入result
List<Node> result = new ArrayList<>(); List<Node> result = new ArrayList<>();
while (!zeroInQueue.isEmpty()) { while (!zeroInQueue.isEmpty()) {
Node cur = zeroInQueue.poll(); Node cur = zeroInQueue.poll();

@ -1,118 +0,0 @@
package class10;
import java.util.HashMap;
import java.util.List;
import java.util.Stack;
public class Code07_MergeUsers {
public static class Node<V> {
V value;
public Node(V v) {
value = v;
}
}
public static class UnionSet<V> {
public HashMap<V, Node<V>> nodes;
public HashMap<Node<V>, Node<V>> parents;
public HashMap<Node<V>, Integer> sizeMap;
public UnionSet(List<V> values) {
for (V cur : values) {
Node<V> node = new Node<>(cur);
nodes.put(cur, node);
parents.put(node, node);
sizeMap.put(node, 1);
}
}
// 从点cur开始一直往上找找到不能再往上的代表点返回
public Node<V> findFather(Node<V> cur) {
Stack<Node<V>> path = new Stack<>();
while (cur != parents.get(cur)) {
path.push(cur);
cur = parents.get(cur);
}
// cur头节点
while (!path.isEmpty()) {
parents.put(path.pop(), cur);
}
return cur;
}
public boolean isSameSet(V a, V b) {
if (!nodes.containsKey(a) || !nodes.containsKey(b)) {
return false;
}
return findFather(nodes.get(a)) == findFather(nodes.get(b));
}
public void union(V a, V b) {
if (!nodes.containsKey(a) || !nodes.containsKey(b)) {
return;
}
Node<V> aHead = findFather(nodes.get(a));
Node<V> bHead = findFather(nodes.get(b));
if (aHead != bHead) {
int aSetSize = sizeMap.get(aHead);
int bSetSize = sizeMap.get(bHead);
Node<V> big = aSetSize >= bSetSize ? aHead : bHead;
Node<V> small = big == aHead ? bHead : aHead;
parents.put(small, big);
sizeMap.put(big, aSetSize + bSetSize);
sizeMap.remove(small);
}
}
public int getSetNum() {
return sizeMap.size();
}
}
public static class User {
public String a;
public String b;
public String c;
public User(String a, String b, String c) {
this.a = a;
this.b = b;
this.c = c;
}
}
// (1,10,13) (2,10,37) (400,500,37)
// 如果两个usera字段一样、或者b字段一样、或者c字段一样就认为是一个人
// 请合并users返回合并之后的用户数量
public static int mergeUsers(List<User> users) {
UnionSet<User> unionFind = new UnionSet<>(users);
HashMap<String, User> mapA = new HashMap<>();
HashMap<String, User> mapB = new HashMap<>();
HashMap<String, User> mapC = new HashMap<>();
for(User user : users) {
if(mapA.containsKey(user.a)) {
unionFind.union(user, mapA.get(user.a));
}else {
mapA.put(user.a, user);
}
if(mapB.containsKey(user.b)) {
unionFind.union(user, mapB.get(user.b));
}else {
mapB.put(user.b, user);
}
if(mapC.containsKey(user.c)) {
unionFind.union(user, mapC.get(user.c));
}else {
mapC.put(user.c, user);
}
}
// 向并查集询问,合并之后,还有多少个集合?
return unionFind.getSetNum();
}
}
Loading…
Cancel
Save