private static void TestMatrixStuff() { Graph g = new Graph(); g.Directed = true; Vertex v1 = new Vertex(); Vertex v2 = new Vertex(); Vertex v3 = new Vertex(); Vertex v4 = new Vertex(); g.AddVertex(v1); g.AddVertex(v2); g.AddVertex(v3); g.AddVertex(v4); g.AddEdge(new Edge(v2, v1, 25f)); g.AddEdge(new Edge(v1, v3, 10f)); g.RemoveEdge(g.GetEdges()[1]); g.AddEdge(new Edge(v4, v2, 7f)); g.RemoveVertex(v1); g.RemoveVertex(v2); g.AddEdge(new Edge(v3, v4, 30f)); g.AddEdge(new Edge(v4, v3, 27f)); Console.WriteLine("Testing graph insertion and deletion"); g.PrintMatrix(); Console.WriteLine(); Graph g2 = new Graph(); g.CopyTo(g2); g2.PrintMatrix(); }
public bool RemoveEdge(Edge e) { checkNullGraph(currentGraph); currentGraph.RemoveEdge(e); return(true); }
public static float MaximumFlow(FlowNetwork fn, int source, int sink) { float maxFlow = 0f; int sourceIndex = source; int sinkIndex = sink; foreach (FlowEdge e in fn.GetEdges()) { e.CurrentFlow = 0f; } Graph g = CreateResidualNetwork(fn); List <Edge> augmentingPath = BreadthFirstSearch(g, sourceIndex, sinkIndex); while (augmentingPath != null) { float minFlow = float.MaxValue; //find min flow foreach (Edge e in augmentingPath) { if (e.Weight < minFlow) { minFlow = e.Weight; } } maxFlow += minFlow; foreach (Edge e in augmentingPath) { //Update residual graph Edge currentForwardResid = g.FindEdge(e); Edge currentBackwardResid = g.FindEdge(new Edge(e.GetToVertex(), e.GetFromVertex())); float newForwardWeight = currentForwardResid.Weight - minFlow; if (newForwardWeight <= 0f) { g.RemoveEdge(currentForwardResid); } else { currentForwardResid.Weight = newForwardWeight; } if (currentBackwardResid != null) { float newBackwardWeight = currentBackwardResid.Weight + minFlow; currentBackwardResid.Weight = newBackwardWeight; } else { currentBackwardResid = new Edge(e.GetToVertex(), e.GetFromVertex(), minFlow); g.AddEdge(currentBackwardResid); } //Update flow network FlowEdge fe = fn.FindEdge(new FlowEdge(e.GetFromVertex(), e.GetToVertex(), 0, 0)); fe.CurrentFlow = fe.CurrentFlow + minFlow; } augmentingPath = BreadthFirstSearch(g, sourceIndex, sinkIndex); //augmentingPath = null; } return(maxFlow); }