-
Notifications
You must be signed in to change notification settings - Fork 2
/
Solution.java
141 lines (105 loc) · 3.28 KB
/
Solution.java
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package hackrank.algorithm.graph.primsubtree;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Set;
/**
* Prim's (MST): Special Subtree
*
* @see https://www.hackerrank.com/challenges/primsmstsub
*/
public class Solution {
public static void main(String[] args) {
Graph graph = readInput(System.in);
System.out.println(graph.findPrimMinSpanWeight());
}
private static Graph readInput(InputStream input) {
Scanner scanner = new Scanner(input);
int numberNodes = scanner.nextInt();
int numberEdges = scanner.nextInt();
int[][] edges = new int[numberEdges][];
for (int e = 0; e < numberEdges; e++) {
edges[e] = new int[] { scanner.nextInt(), scanner.nextInt(), scanner.nextInt() };
}
int startNodeId = scanner.nextInt();
scanner.close();
return new Graph(numberNodes, edges, startNodeId);
}
}
class Graph {
public Map<Integer, Node> nodes;
public int startNodeId;
public Graph(int numberNodes, int[][] edges, int startNodeId) {
this.nodes = new HashMap<>(numberNodes, 1.0f);
for (int nodeId = 1; nodeId <= numberNodes; nodeId++) {
nodes.put(nodeId, new Node(nodeId));
}
for (int[] edge : edges) {
connect(edge[0], edge[1], edge[2]);
}
this.startNodeId = startNodeId;
}
public void connect(int idFrom, int idTo, int weight) {
Node from = nodes.get(idFrom);
Node to = nodes.get(idTo);
from.connect(to, weight);
to.connect(from, weight);
}
public int findPrimMinSpanWeight() {
Node start = nodes.get(startNodeId);
Set<Integer> visited = new HashSet<>(nodes.size());
visited.add(start.id);
PriorityQueue<Edge> edgesQueue = new PriorityQueue<Edge>(start.edges);
int totalEdgeWeight = 0;
while (!edgesQueue.isEmpty()) {
Edge edge = edgesQueue.poll();
if (visited.contains(edge.target.id)) {
continue;
}
totalEdgeWeight += edge.weight;
visited.add(edge.target.id);
for (Edge nextEdge : edge.target.edges) {
if (!visited.contains(nextEdge.target.id)) {
edgesQueue.add(nextEdge);
}
}
}
return totalEdgeWeight;
}
}
class Node {
public int id;
public List<Edge> edges;
public Node(int id) {
this.id = id;
this.edges = new ArrayList<>();
}
public void connect(Node square, int weight) {
edges.add(new Edge(square, weight));
}
@Override
public String toString() {
return String.valueOf(id);
}
}
class Edge implements Comparable<Edge> {
public Node target;
public int weight;
public Edge(Node target, int weight) {
this.target = target;
this.weight = weight;
}
@Override
public int compareTo(Edge other) {
return Integer.compare(weight, other.weight);
}
@Override
public String toString() {
return "-" + weight + "-> Node(" + target.id + ")";
}
}