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
| public class Kruskal { static class Edge implements Comparable<Edge> { List<Vertex> vertices; int start; int end; int weight;
public Edge(List<Vertex> vertices, int start, int end, int weight) { this.vertices = vertices; this.start = start; this.end = end; this.weight = weight; }
public Edge(int start, int end, int weight) { this.start = start; this.end = end; this.weight = weight; }
@Override public int compareTo(Edge o) { return Integer.compare(this.weight, o.weight); }
@Override public String toString() { return vertices.get(start).name + "<->" + vertices.get(end).name + "(" + weight + ")"; } }
public static void main(String[] args) { Vertex v1 = new Vertex("v1"); Vertex v2 = new Vertex("v2"); Vertex v3 = new Vertex("v3"); Vertex v4 = new Vertex("v4"); Vertex v5 = new Vertex("v5"); Vertex v6 = new Vertex("v6"); Vertex v7 = new Vertex("v7");
List<Vertex> vertices = List.of(v1, v2, v3, v4, v5, v6, v7); PriorityQueue<Edge> queue = new PriorityQueue<>(List.of( new Edge(vertices,0, 1, 2), new Edge(vertices,0, 2, 4), new Edge(vertices,0, 3, 1), new Edge(vertices,1, 3, 3), new Edge(vertices,1, 4, 10), new Edge(vertices,2, 3, 2), new Edge(vertices,2, 5, 5), new Edge(vertices,3, 4, 7), new Edge(vertices,3, 5, 8), new Edge(vertices,3, 6, 4), new Edge(vertices,4, 6, 6), new Edge(vertices,5, 6, 1) ));
kruskal(vertices.size(), queue); }
static void kruskal(int size, PriorityQueue<Edge> queue) { List<Edge> result = new ArrayList<>(); DisjointSet set = new DisjointSet(size); while (result.size() < size - 1) { Edge poll = queue.poll(); int s = set.find(poll.start); int e = set.find(poll.end); if (s != e) { result.add(poll); set.union(s, e); } }
for (Edge edge : result) { System.out.println(edge); } } }
|