import
java.io.*;
import
java.util.*;
import
java.lang.Comparable;
public
class
MST {
static
class
Pair<U
extends
Comparable<U>,
V
extends
Comparable<V> >
implements
Comparable<Pair<U, V> > {
public
final
U a;
public
final
V b;
private
Pair(U a, V b)
{
this
.a = a;
this
.b = b;
}
@Override
public
boolean
equals(Object o)
{
if
(
this
== o)
return
true
;
if
(o ==
null
|| getClass() != o.getClass())
return
false
;
Pair<?, ?> pair = (Pair<?, ?>)o;
if
(!a.equals(pair.a))
return
false
;
return
b.equals(pair.b);
}
@Override
public
int
hashCode()
{
return
31
* a.hashCode() + b.hashCode();
}
@Override
public
String toString()
{
return
"("
+ a +
", "
+ b +
")"
;
}
@Override
public
int
compareTo(Pair<U, V> o)
{
return
getV().compareTo(o.getV());
}
private
U getU()
{
return
a;
}
private
V getV()
{
return
b;
}
}
static
class
Graph {
int
vertices;
ArrayList[] edges;
static
Pair<Pair<Integer, Integer>,
Integer>
minCostEdge;
Graph(
int
vertices)
{
minCostEdge =
new
Pair<>(
new
Pair<>(
1
,
1
),
Integer.MAX_VALUE);
this
.vertices = vertices;
edges =
new
ArrayList[vertices +
1
];
for
(
int
i =
0
; i <= vertices; i++) {
edges[i]
=
new
ArrayList<Pair<Integer, Integer> >();
}
}
void
addEdge(
int
a,
int
b,
int
weight)
{
edges[a].add(
new
Pair<>(b, weight));
edges[b].add(
new
Pair<>(a, weight));
if
(weight < minCostEdge.b) {
minCostEdge
=
new
Pair<>(
new
Pair<>(a, b), weight);
}
}
void
MST()
{
PriorityQueue<Pair<Pair<Integer, Integer>,
Integer> >
priorityQueue
=
new
PriorityQueue<>();
Iterator<Pair<Integer, Integer> > iterator
= edges[minCostEdge.a.a].listIterator();
while
(iterator.hasNext()) {
Pair<Integer, Integer> pair
= iterator.next();
priorityQueue.add(
new
Pair<>(
new
Pair<>(minCostEdge.a.a, pair.a),
pair.b));
}
iterator = edges[minCostEdge.a.b].listIterator();
while
(iterator.hasNext()) {
Pair<Integer, Integer> pair = iterator.next();
priorityQueue.add(
new
Pair<>(
new
Pair<>(minCostEdge.a.b, pair.a),
pair.b));
}
Set<Integer> addedVertices =
new
HashSet<>();
Set<Pair<Pair<Integer, Integer>, Integer> > addedEdges
=
new
HashSet<>();
while
(addedEdges.size() < vertices -
1
) {
Pair<Pair<Integer, Integer>, Integer> pair
= priorityQueue.poll();
if
(!addedVertices.contains(pair.a.a)) {
addedVertices.add(pair.a.a);
addedEdges.add(pair);
iterator = edges[pair.a.a].listIterator();
while
(iterator.hasNext()) {
Pair<Integer, Integer> pair1
= iterator.next();
priorityQueue.add(
new
Pair<>(
new
Pair<>(pair.a.a, pair1.a),
pair1.b));
}
}
if
(!addedVertices.contains(pair.a.b)) {
addedVertices.add(pair.a.b);
addedEdges.add(pair);
iterator = edges[pair.a.b].listIterator();
while
(iterator.hasNext()) {
Pair<Integer, Integer> pair1
= iterator.next();
priorityQueue
.add(
new
Pair<>(
new
Pair<>(pair.a.b, pair1.a),
pair1.b));
}
}
}
Iterator<Pair<Pair<Integer, Integer>, Integer> > iterator1
= addedEdges.iterator();
System.out.println(
"((A"
+
", "
+
"B)"
+
", "
+
"Cost)"
);
while
(iterator1.hasNext()) {
System.out.println(iterator1.next());
}
}
}
public
static
void
main(String[] args)
throws
IOException
{
Graph g =
new
Graph(
9
);
g.addEdge(
0
,
1
,
4
);
g.addEdge(
0
,
7
,
8
);
g.addEdge(
1
,
2
,
8
);
g.addEdge(
1
,
7
,
11
);
g.addEdge(
2
,
3
,
7
);
g.addEdge(
2
,
8
,
2
);
g.addEdge(
2
,
5
,
4
);
g.addEdge(
3
,
4
,
9
);
g.addEdge(
3
,
5
,
14
);
g.addEdge(
4
,
5
,
10
);
g.addEdge(
5
,
6
,
2
);
g.addEdge(
6
,
7
,
1
);
g.addEdge(
6
,
8
,
6
);
g.addEdge(
7
,
8
,
7
);
g.MST();
}
}