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); }
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); }
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); }
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; } }