Esempio n. 1
0
        public int FindMinCutKargerStein()
        {
            _edgesList = GraphGenerator.CreateEdgesList(_graphArray);
            var graph = new UnionFind(_verticesCount);

            return(FindMinCutKargerSteinRecursive(graph, _verticesCount));
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        //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);
        }
Esempio n. 4
0
        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);
        }