Skip to content

Instantly share code, notes, and snippets.

@vadim8kiselev
Created December 12, 2016 19:38
Show Gist options
  • Save vadim8kiselev/327694c80453fbeb26e101558f875a5d to your computer and use it in GitHub Desktop.
Save vadim8kiselev/327694c80453fbeb26e101558f875a5d to your computer and use it in GitHub Desktop.
package main.graph.command.impl;
import main.graph.Graph;
import main.graph.command.Executor;
import main.graph.vertex.unweight.Vertex;
import java.util.*;
public class FindMaxStreamByFordFulkersonAlgorithm implements Executor {
@Override
public Integer execute(Graph structure, Vertex... params) {
Map<Integer, LinkedHashMap<Integer, Integer>> graph = structure.getGraph(); // FIXME:
//
Integer start = params[0].getVertexID();
Integer finish = params[1].getVertexID();
List<Integer> flows = new ArrayList<Integer>();
int[] parent = new int[graph.size()];
while (bfs(graph, parent, start, finish)) {
int pathFlow = Integer.MAX_VALUE;
for (int vertex = finish; vertex != start; vertex = parent[vertex]) {
pathFlow = Math.min(pathFlow, graph.get(parent[vertex] + 1).get(vertex + 1));
}
for (int vertex = finish; vertex != start; vertex = parent[vertex]) {
graph.get(parent[vertex] + 1).put(vertex + 1, graph.get(parent[vertex] + 1).get(vertex + 1) - pathFlow);
}
flows.add(pathFlow);
}
return sum(flows);
}
private boolean bfs(Map<Integer, LinkedHashMap<Integer, Integer>> graph, int parent[], Integer start, Integer finish) {
boolean[] used = new boolean[graph.size()];
Queue<Integer> queue = new ArrayDeque<>();
queue.add(start + 1);
used[start] = true;
parent[start] = -1;
while (!queue.isEmpty()) {
int u = queue.poll() - 1;
for (Integer vertex : graph.get(u + 1).keySet()) {
if (!used[vertex - 1] && graph.get(u + 1).get(vertex) > 0) {
queue.add(vertex);
parent[vertex - 1] = u;
used[vertex - 1] = true;
}
}
}
return used[finish];
}
public int sum(List<Integer> ints) {
return ints.isEmpty() ? 0 : ints.get(0) + sum(ints.subList(1, ints.size()));
}
}
/*
5
1 2-2 3-3
2 3-3 4-4
3 5-2
4 5-1
5
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment