package graphtea.extensions.reports.spectralreports.maxflowmincut;
import graphtea.graph.graph.GraphModel;
import graphtea.graph.graph.Vertex;
import java.util.LinkedList;
public class MinCut{
public double C[][];
public double F[][];
public Vertex source,sink;
public LinkedList<Integer> cut = new LinkedList<>();
public boolean showResult;
protected int n;
protected GraphModel g;
protected double Cf[][];
protected PushRelabel PR;
public MinCut(GraphModel g, Vertex source, Vertex sink, boolean showResult) {
this.g = g;
this.source = source;
this.sink = sink;
this.showResult = showResult;
PR = new PushRelabel(g, source, sink, showResult);
}
public int perform()
{
int res = doAlgorithm();
if(showResult)
makeLabels();
return res;
}
public int calcMinCutVal()
{
// TO DO: Modify this not to instantiate a new PR every time but
// to use the same PR with new source and sinks.
//PushRelabel PR = new PushRelabel(g, source, sink, false);
reinitialize();
return(PR.perform());
}
private void reinitialize()
{
PR.source = this.source;
PR.sink = this.sink;
PR.showResult = this.showResult;
cut.clear();
}
protected int doAlgorithm()
{
reinitialize();
int res = PR.perform();
C = PR.C;
F = PR.F;
n = C.length;
Cf = new double[n][n];
for(int i=0; i<n ; i++)
for(int j=0; j<n ; j++)
Cf[i][j] = C[i][j] - F[i][j] + F[j][i];
findCut();
return res;
}
private void findCut()
{
//Using BFS we find all the reachable vertices from source
// on the residual network
boolean[] seen = new boolean[n];
LinkedList<Integer> queue = new LinkedList<>();
int s = source.getId();
seen[s]=true;
queue.add(s);
cut.add(s);
int v;
while(!queue.isEmpty())
{
v=queue.removeFirst();
for(int i=0 ; i < n ; i++)
{
if(Cf[v][i]>0)
if(!seen[i])
{
seen[i]=true;
queue.add(i);
cut.add(i);
}
}
}
}
protected void makeLabels()
{
for(int t=0; t<n ; t++)
{
if(cut.contains(t))
g.getVertex(t).setColor(7);
else
g.getVertex(t).setColor(3);
}
}
}