Introduce MinimumSpanningForestAlgorithm and implement Kruskal
This commit is contained in:
62
src/main/java/h07/algorithm/Kruskal.java
Normal file
62
src/main/java/h07/algorithm/Kruskal.java
Normal file
@ -0,0 +1,62 @@
|
||||
package h07.algorithm;
|
||||
|
||||
import aud.exam.prep.Pair;
|
||||
import h07.graph.DirectedGraph;
|
||||
import h07.graph.DirectedGraphFactory;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class Kruskal<V, A> implements MinimumSpanningForestAlgorithm<V, A> {
|
||||
|
||||
@Override
|
||||
public DirectedGraph<V, A> minimumSpanningForest(DirectedGraph<V, A> graph, Comparator<? super A> comparator, DirectedGraphFactory<V, A> factory) {
|
||||
var output = factory.createDirectedGraph();
|
||||
var sets = new ArrayList<Set<V>>();
|
||||
|
||||
for (V node : graph.getAllNodes()) {
|
||||
output.addNode(node);
|
||||
|
||||
var set = new HashSet<V>();
|
||||
set.add(node);
|
||||
sets.add(set);
|
||||
}
|
||||
|
||||
var egdes = graph.getAllNodes()
|
||||
.stream()
|
||||
.flatMap(n ->
|
||||
graph.getChildrenForNode(n)
|
||||
.stream()
|
||||
.map(c ->
|
||||
new Pair<>(n, c)))
|
||||
.sorted(Comparator.comparing(
|
||||
p -> graph.getArcWeightBetween(p.fst, p.snd),
|
||||
comparator));
|
||||
|
||||
egdes.forEach(p -> {
|
||||
var s1 = sets
|
||||
.stream()
|
||||
.filter(s -> s.contains(p.fst))
|
||||
.findFirst()
|
||||
.orElseThrow();
|
||||
|
||||
if (s1.contains(p.snd)) {
|
||||
return;
|
||||
}
|
||||
|
||||
var s2 = sets
|
||||
.stream()
|
||||
.filter(s -> s.contains(p.snd))
|
||||
.findFirst()
|
||||
.orElseThrow();
|
||||
|
||||
s1.addAll(s2);
|
||||
sets.remove(s2);
|
||||
|
||||
var arc = graph.getArcWeightBetween(p.fst, p.snd);
|
||||
output.connectNodes(p.fst, arc, p.snd);
|
||||
output.connectNodes(p.snd, arc, p.fst);
|
||||
});
|
||||
|
||||
return output;
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package h07.algorithm;
|
||||
|
||||
import h07.graph.DirectedGraph;
|
||||
import h07.graph.DirectedGraphFactory;
|
||||
|
||||
import java.util.Comparator;
|
||||
|
||||
public interface MinimumSpanningForestAlgorithm<V, A> {
|
||||
|
||||
DirectedGraph<V, A> minimumSpanningForest(DirectedGraph<V, A> graph, Comparator<? super A> comparator, DirectedGraphFactory<V, A> factory);
|
||||
}
|
11
src/main/java/h07/algorithm/Pair.java
Normal file
11
src/main/java/h07/algorithm/Pair.java
Normal file
@ -0,0 +1,11 @@
|
||||
package h07.algorithm;
|
||||
|
||||
public class Pair<T, S> {
|
||||
public T fst;
|
||||
public S snd;
|
||||
|
||||
public Pair(T fst, S snd) {
|
||||
this.fst = fst;
|
||||
this.snd = snd;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user