public int FindMinCutKargerStein() { _edgesList = GraphGenerator.CreateEdgesList(_graphArray); var graph = new UnionFind(_verticesCount); return(FindMinCutKargerSteinRecursive(graph, _verticesCount)); }
private int FindMinCutAdjacencyListOnce(Random generator) { _adjacencyList = GraphGenerator.CreateAdjacencyList(_graphArray); while (_adjacencyList.Count > 2) { var randomNum = generator.Next(_adjacencyList.Count); var start = _adjacencyList.Keys.ElementAt(randomNum); var startEdges = _adjacencyList[start]; var finish = startEdges[generator.Next(startEdges.Count)]; var finishEdges = _adjacencyList[finish]; startEdges.RemoveAll(x => x == finish); foreach (var vertex in finishEdges) { if (vertex == start) { continue; } startEdges.Add(vertex); _adjacencyList[vertex].RemoveAll(x => x == finish); _adjacencyList[vertex].Add(start); } _adjacencyList.Remove(finish); } return(_adjacencyList[_adjacencyList.Keys.ElementAt(0)].Count); }
//TODO: Init adjacency list with actual node ids instead of consecutive numbers private Dictionary <int, List <int> > ReverseEdges(Dictionary <int, List <int> > graph) { var reversedGraph = new Dictionary <int, List <int> >(_nodeCount); GraphGenerator.InitializeAdjacencyList(reversedGraph, _nodeCount); foreach (var node in graph) { var tailNode = node.Key; foreach (var headNode in graph[tailNode]) { reversedGraph[headNode].Add(tailNode); } } return(reversedGraph); }
public int FindMinCutUnion() { _edgesList = GraphGenerator.CreateEdgesList(_graphArray); var trialsNumber = GetDefaultTrials(); var lowestCut = int.MaxValue; for (int i = 0; i < trialsNumber; i++) { var randomGenerator = new Random(i); var currentCut = FindMinCutUnionOnce(randomGenerator); if (currentCut > lowestCut) { continue; } lowestCut = currentCut; } return(lowestCut); }