using
System;
using
System.Collections.Generic;
class
GFG
{
static
List<List<
int
>> edges =
new
List<List<
int
>>();
static
int
FindParent(
int
a,
int
[] parentOf)
{
if
(parentOf[a] == -1)
return
a;
return
parentOf[a] = FindParent(parentOf[a], parentOf);
}
static
void
UnionSet(
int
a,
int
b,
int
[] parentOf,
int
[] rank)
{
int
s1 = FindParent(a, parentOf);
int
s2 = FindParent(b, parentOf);
if
(s1 != s2)
{
int
r1 = rank[s1];
int
r2 = rank[s2];
if
(r1 >= r2)
{
parentOf[s2] = s1;
rank[s1] = r1 + r2;
}
else
{
parentOf[s1] = s2;
rank[s2] = r1 + r2;
}
}
}
static
int
CalculateMst(
int
N)
{
int
cost = 0;
int
[] rank =
new
int
[N + 1];
int
[] parentOf =
new
int
[N + 1];
Array.Fill(rank, -1);
Array.Fill(parentOf, -1);
for
(
int
i = 0; i < edges.Count; i++)
{
int
wt = edges[i][0];
int
a = edges[i][1];
int
b = edges[i][2];
if
(FindParent(a, parentOf) != FindParent(b, parentOf))
{
cost += wt;
UnionSet(a, b, parentOf, rank);
}
}
return
cost;
}
static
void
Graph(List<(
int
,
int
)> v)
{
for
(
int
i = 0; i < v.Count - 1; i++)
{
int
dist = v[i + 1].Item1 - v[i].Item1;
int
nodeone = v[i].Item2;
int
nodesecond = v[i + 1].Item2;
List<
int
> al =
new
List<
int
> { dist, nodeone, nodesecond };
edges.Add(al);
}
}
static
void
Solve(
int
[,] a,
int
N)
{
List<(
int
,
int
)> x =
new
List<(
int
,
int
)>();
List<(
int
,
int
)> y =
new
List<(
int
,
int
)>();
List<(
int
,
int
)> z =
new
List<(
int
,
int
)>();
for
(
int
i = 0; i < N; i++)
{
x.Add((a[i, 0], i + 1));
y.Add((a[i, 1], i + 1));
z.Add((a[i, 2], i + 1));
}
x.Sort((a, b) => a.Item1 - b.Item1);
y.Sort((a,b) => a.Item1 - b.Item1);
z.Sort((a, b) => a.Item1 - b.Item1);
Graph(x);
Graph(y);
Graph(z);
edges.Sort((a, b) => a[0] - b[0]);
return
;
}
static
void
Graph(List<Tuple<
int
,
int
>> v)
{
for
(
int
i = 0; i < v.Count - 1; i++)
{
int
dist = v[i + 1].Item1 - v[i].Item1;
int
nodeone = v[i].Item2;
int
nodesecond = v[i + 1].Item2;
List<
int
> al =
new
List<
int
> { dist, nodeone, nodesecond };
edges.Add(al);
}
}
static
int
CalculateMST(
int
N)
{
int
cost = 0;
int
[] rank =
new
int
[N + 1];
int
[] parentOf =
new
int
[N + 1];
for
(
int
i = 0; i <= N; i++)
{
rank[i] = -1;
parentOf[i] = -1;
}
for
(
int
i = 0; i < edges.Count; i++)
{
int
wt = edges[i][0];
int
a = edges[i][1];
int
b = edges[i][2];
if
(FindParent(a, parentOf) != FindParent(b, parentOf))
{
cost += wt;
UnionSet(a, b, parentOf, rank);
}
}
return
cost;
}
static
void
Main(
string
[] args)
{
int
[,] arr = { { 1, 2, 3 },
{ 6, 8, 1 },
{ 5, 3, 4 },
{ 8, 5, 6 } };
Solve(arr, 4);
Console.WriteLine(CalculateMST(4));
}
}