Ejemplo n.º 1
0
        public LinkedList <Vertex> GetSortedMergedVertex(ContractibleEdge pCe)
        {
            LinkedList <Vertex>     sortedMergedList = new LinkedList <Vertex>();
            LinkedListNode <Vertex> headCurrNode = pCe.Head.First, tailCurrNode = pCe.Tail.First;

            for (int i = 0; i < pCe.Head.Count + pCe.Tail.Count; i++)
            {
                if (headCurrNode != null && tailCurrNode != null)
                {
                    if (headCurrNode.Value.Label <= tailCurrNode.Value.Label)
                    {
                        sortedMergedList.AddLast(new LinkedListNode <Vertex>(headCurrNode.Value));
                        headCurrNode = headCurrNode.Next;
                    }
                    else
                    {
                        sortedMergedList.AddLast(new LinkedListNode <Vertex>(tailCurrNode.Value));
                        tailCurrNode = tailCurrNode.Next;
                    }
                }
                if (headCurrNode == null && tailCurrNode != null)
                {
                    sortedMergedList.AddLast(new LinkedListNode <Vertex>(tailCurrNode.Value));
                    tailCurrNode = tailCurrNode.Next;
                }
                if (tailCurrNode == null && headCurrNode != null)
                {
                    sortedMergedList.AddLast(new LinkedListNode <Vertex>(headCurrNode.Value));
                    headCurrNode = headCurrNode.Next;
                }
            }
            return(sortedMergedList);
        }
Ejemplo n.º 2
0
        public LinkedList <Edge> GetCrossingEdgesForMinCut()
        {
            int minCutCrossingEdgeCount           = -1;
            LinkedList <Edge> minCutCrossingEdges = null;
            long noOfTrials = Vertices.Count * Vertices.Count; //n^2

            for (long trialCount = 0; trialCount < noOfTrials; trialCount++)
            {
                ContractibleGraph cGraph = new ContractibleGraph(this);

                int unMergedVertices = Vertices.Count;
                while (unMergedVertices > 2)
                {
                    ContractibleEdge ce = cGraph.GetEdgeToContractUniformlyAtRandom();
                    cGraph.ContractEdgeAndDeleteSelfLoops(ce);
                    unMergedVertices--;
                }

                if (minCutCrossingEdgeCount == -1 || cGraph.ContractibleEdges.Count < minCutCrossingEdgeCount)
                {
                    minCutCrossingEdgeCount = cGraph.ContractibleEdges.Count;
                    minCutCrossingEdges     = new LinkedList <Edge>();
                    for (int i = 0; i < minCutCrossingEdgeCount; i++)
                    {
                        minCutCrossingEdges.AddLast(cGraph.ContractibleEdges.First().OriginalEdge);
                        cGraph.ContractibleEdges.RemoveFirst();
                    }
                }
            }
            return(minCutCrossingEdges);
        }
Ejemplo n.º 3
0
        private LinkedList <ContractibleEdge> GetContractibleEdgesForGraph()
        {
            LinkedList <ContractibleEdge> result = new LinkedList <ContractibleEdge>();

            foreach (Edge e in OriginalGraph.Edges)
            {
                ContractibleEdge cEdge = new ContractibleEdge();

                cEdge.OriginalEdge = e;

                cEdge.Head = new LinkedList <Vertex>();
                cEdge.Head.AddLast(e.Head);

                cEdge.Tail = new LinkedList <Vertex>();
                cEdge.Tail.AddLast(e.Tail);

                result.AddLast(cEdge);
            }
            return(result);
        }
Ejemplo n.º 4
0
        public void ContractEdgeAndDeleteSelfLoops(ContractibleEdge pCe)
        {
            //Sorted for faster comparison later while replacing component vertices with merged ones
            LinkedList <Vertex> sortedMergedVertex = GetSortedMergedVertex(pCe);

            LinkedListNode <ContractibleEdge> currNode = ContractibleEdges.First;

            while (currNode != null)
            {
                LinkedListNode <ContractibleEdge> nextNode = currNode.Next;
                if (currNode.Value == pCe)
                {
                    ContractibleEdges.Remove(currNode);
                    currNode = nextNode;
                    continue;
                }

                //Replace component vertices at all places with merged vertex
                if (AreSameSortedMergedVertex(pCe.Head, currNode.Value.Head) ||
                    AreSameSortedMergedVertex(pCe.Tail, currNode.Value.Head))
                {
                    currNode.Value.Head = sortedMergedVertex;
                }
                if (AreSameSortedMergedVertex(pCe.Tail, currNode.Value.Tail) ||
                    AreSameSortedMergedVertex(pCe.Head, currNode.Value.Tail))
                {
                    currNode.Value.Tail = sortedMergedVertex;
                }

                //Delete Self Loops
                if (AreSameSortedMergedVertex(currNode.Value.Head, currNode.Value.Tail))
                {
                    ContractibleEdges.Remove(currNode);
                }

                currNode = nextNode;
            }
        }