import
java.util.ArrayList;
import
java.util.Collections;
import
java.util.List;
class
GFG {
static
List<Integer> parent;
static
void
disjoint(
int
size)
{
parent =
new
ArrayList<>(size +
1
);
for
(
int
i =
0
; i <= size; i++) {
parent.add(i);
}
}
static
int
find(
int
u)
{
if
(parent.get(u) == u)
return
u;
parent.set(u, find(parent.get(u)));
return
parent.get(u);
}
static
void
merge(
int
u,
int
v)
{
int
ua = find(u);
int
ub = find(v);
parent.set(ua, ub);
}
static
int
help1(List<
int
[]> e,
int
j,
int
n)
{
disjoint(n +
1
);
List<Pair<Integer, Pair<Integer, Integer> > > v
=
new
ArrayList<>();
for
(
int
i =
0
; i < e.size(); i++) {
if
(i == j)
continue
;
v.add(
new
Pair<>(
e.get(i)[
2
],
new
Pair<>(e.get(i)[
0
], e.get(i)[
1
])));
}
Collections.sort(v,
(a, b) -> a.getKey() - b.getKey());
int
mst_weight =
0
;
int
edges =
0
;
for
(
int
i =
0
; i < v.size(); i++) {
Pair<Integer, Pair<Integer, Integer> > x
= v.get(i);
int
a = find(x.getValue().getKey());
int
b = find(x.getValue().getValue());
if
(a != b) {
edges++;
mst_weight += x.getKey();
merge(a, b);
}
}
if
(edges != n -
1
)
return
Integer.MAX_VALUE;
return
mst_weight;
}
static
int
help2(List<
int
[]> e,
int
j,
int
n)
{
disjoint(n +
1
);
int
mst_weight = e.get(j)[
2
];
merge(e.get(j)[
1
], e.get(j)[
0
]);
List<Pair<Integer, Pair<Integer, Integer> > > v
=
new
ArrayList<>();
for
(
int
i =
0
; i < e.size(); i++) {
if
(i == j)
continue
;
v.add(
new
Pair<>(
e.get(i)[
2
],
new
Pair<>(e.get(i)[
0
], e.get(i)[
1
])));
}
Collections.sort(v,
(a, b) -> a.getKey() - b.getKey());
for
(
int
i =
0
; i < v.size(); i++) {
Pair<Integer, Pair<Integer, Integer> > x
= v.get(i);
int
a = find(x.getValue().getKey());
int
b = find(x.getValue().getValue());
if
(a != b) {
mst_weight += x.getKey();
merge(a, b);
}
}
return
mst_weight;
}
static
List<List<Integer> >
findCriticalAndPseudoCriticalEdges(
int
n, List<
int
[]> e)
{
disjoint(n +
1
);
int
mst_weight = help1(e, -
1
, n);
List<Integer> v1 =
new
ArrayList<>();
List<Integer> v2 =
new
ArrayList<>();
List<List<Integer> > ans =
new
ArrayList<>();
for
(
int
i =
0
; i < e.size(); i++) {
int
new_weight1 = help1(e, i, n);
int
new_weight2 = help2(e, i, n);
if
(new_weight1 > mst_weight) {
v1.add(i);
}
else
if
(new_weight2 == mst_weight) {
v2.add(i);
}
}
ans.add(v1);
ans.add(v2);
return
ans;
}
public
static
void
main(String[] args)
{
int
vertices =
5
;
List<List<Integer> > ans;
List<
int
[]> edges =
new
ArrayList<>();
edges.add(
new
int
[] {
0
,
1
,
1
});
edges.add(
new
int
[] {
1
,
2
,
1
});
edges.add(
new
int
[] {
2
,
3
,
2
});
edges.add(
new
int
[] {
0
,
3
,
2
});
edges.add(
new
int
[] {
0
,
4
,
3
});
edges.add(
new
int
[] {
3
,
4
,
3
});
edges.add(
new
int
[] {
1
,
4
,
6
});
ans = findCriticalAndPseudoCriticalEdges(vertices,
edges);
for
(List<Integer> it : ans) {
System.out.print(
"["
);
for
(
int
i : it) {
System.out.print(i +
" "
);
}
System.out.println(
"]"
);
}
}
static
class
Pair<K, V> {
private
final
K key;
private
final
V value;
public
Pair(K key, V value)
{
this
.key = key;
this
.value = value;
}
public
K getKey() {
return
key; }
public
V getValue() {
return
value; }
}
}