using
System;
using
System.Collections;
using
System.Collections.Generic;
public
class
GFG {
public
static
int
cmp(List<
int
> a, List<
int
> b)
{
if
(a[0] > b[0])
return
-1;
return
1;
}
public
static
int
find(
int
x, List<
int
> parent)
{
if
(parent[x] == x)
return
x;
return
parent[x] = find(parent[x], parent);
}
public
static
bool
union1(
int
x,
int
y, List<
int
> parent, List<
int
> rank)
{
int
lx = find(x, parent);
int
ly = find(y, parent);
if
(lx != ly) {
if
(rank[lx] > rank[ly]) {
parent[ly] = lx;
}
else
if
(rank[lx] < rank[ly]) {
parent[lx] = ly;
}
else
{
parent[lx] = ly;
rank[ly] += 1;
}
return
true
;
}
return
false
;
}
public
static
int
removeMaxEdges(
int
n,
List<List<
int
> > edges)
{
int
n1 = n + 1;
edges.Sort(cmp);
List<
int
> parentA =
new
List<
int
>();
List<
int
> parentB =
new
List<
int
>();
List<
int
> rankA =
new
List<
int
>();
List<
int
> rankB =
new
List<
int
>();
for
(
int
i = 0; i < n1; i++) {
parentA.Add(0);
parentB.Add(0);
rankA.Add(0);
rankB.Add(0);
}
for
(
int
i = 1; i <= n; i++) {
parentA[i] = i;
parentB[i] = i;
rankA[i] = 1;
rankB[i] = 1;
}
int
connectedComponentA = n,
connectedComponentB = n, remove = 0;
for
(
int
i = 0; i < edges.Count; i++) {
if
(edges[i][0] == 2) {
bool
mergeA
= union1(edges[i][1], edges[i][2],
parentA, rankA);
bool
mergeB
= union1(edges[i][1], edges[i][2],
parentB, rankB);
if
(mergeA) {
connectedComponentA--;
}
if
(mergeB) {
connectedComponentB--;
}
if
(mergeA ==
false
&& mergeB ==
false
) {
remove++;
}
}
else
if
(edges[i][0] == 1) {
bool
mergeA
= union1(edges[i][1], edges[i][2],
parentA, rankA);
if
(mergeA) {
connectedComponentA--;
}
if
(mergeA ==
false
) {
remove++;
}
}
else
{
bool
mergeB
= union1(edges[i][1], edges[i][2],
parentB, rankB);
if
(mergeB) {
connectedComponentB--;
}
if
(mergeB ==
false
) {
remove++;
}
}
}
if
(connectedComponentA != 1
|| connectedComponentB != 1) {
return
-1;
}
return
remove;
}
static
public
void
Main()
{
int
N = 4;
List<List<
int
> > edges =
new
List<List<
int
> >{
new
List<
int
>{ 0, 1, 2 },
new
List<
int
>{ 0, 3, 4 },
new
List<
int
>{ 1, 1, 2 },
new
List<
int
>{ 1, 2, 4 },
new
List<
int
>{ 2, 1, 2 },
new
List<
int
>{ 2, 1, 3 }
};
Console.WriteLine(removeMaxEdges(N, edges));
}
}