using
System;
using
System.IO;
using
System.Collections.Generic;
class
GFG {
public
class
Edge {
public
int
src, dest;
public
Edge(
int
s,
int
d)
{
this
.src = s;
this
.dest = d;
}
}
public
class
Graph {
public
int
V, E;
public
Edge[] edge;
public
Graph(
int
v,
int
e)
{
this
.V = v;
this
.E = e;
this
.edge =
new
Edge[e];
}
}
public
class
subset {
public
int
parent;
public
int
rank;
public
subset(
int
p,
int
r)
{
this
.parent = p;
this
.rank = r;
}
}
public
static
int
kargerMinCut(Graph graph)
{
int
V = graph.V, E = graph.E;
Edge[] edge = graph.edge;
subset[] subsets =
new
subset[V];
for
(
int
v = 0; v < V; ++v) {
subsets[v] =
new
subset(v, 0);
}
int
vertices = V;
while
(vertices > 2) {
int
i = ((
int
)(
new
Random().NextDouble() * 10))
% E;
int
subset1 = find(subsets, edge[i].src);
int
subset2 = find(subsets, edge[i].dest);
if
(subset1 == subset2) {
continue
;
}
else
{
Console.WriteLine(
"Contracting edge "
+ edge[i].src +
"-"
+ edge[i].dest);
vertices--;
Union(subsets, subset1, subset2);
}
}
int
cutedges = 0;
for
(
int
i = 0; i < E; i++) {
int
subset1 = find(subsets, edge[i].src);
int
subset2 = find(subsets, edge[i].dest);
if
(subset1 != subset2) {
cutedges++;
}
}
return
cutedges;
}
public
static
int
find(subset[] subsets,
int
i)
{
if
(subsets[i].parent != i) {
subsets[i].parent
= find(subsets, subsets[i].parent);
}
return
subsets[i].parent;
}
public
static
void
Union(subset[] subsets,
int
x,
int
y)
{
int
xroot = find(subsets, x);
int
yroot = find(subsets, y);
if
(subsets[xroot].rank < subsets[yroot].rank) {
subsets[xroot].parent = yroot;
}
else
if
(subsets[xroot].rank
> subsets[yroot].rank) {
subsets[yroot].parent = xroot;
}
else
{
subsets[yroot].parent = xroot;
subsets[xroot].rank++;
}
}
public
static
void
Main()
{
int
V = 4, E = 5;
Graph graph =
new
Graph(V, E);
graph.edge[0] =
new
Edge(0, 1);
graph.edge[1] =
new
Edge(0, 2);
graph.edge[2] =
new
Edge(0, 3);
graph.edge[3] =
new
Edge(1, 2);
graph.edge[4] =
new
Edge(2, 3);
Random r =
new
Random();
int
res = kargerMinCut(graph);
Console.WriteLine(
"Cut found by Karger's randomized algo is "
+ res);
}
}