public static void Init() { int nodes = 0, nInicial = 4, nFinal = 7; //g = Graphs.CyclicGraph8Nodes(); int usarGrafoDefinido = Misc.obtenerNumero(" 1 si agregar un grafo o 2 si usar uno predeterminado"); AdjacencyListCapacity graph = new AdjacencyListCapacity(nodes); switch (usarGrafoDefinido) { case 1: nodes = Misc.obtenerNumero(" número de nodos"); graph = Graphs.crearGrafica(nodes); break; case 2: graph = Graphs.Cyclic8Nodes(); nodes = 8; break; default: Console.WriteLine("hhhh"); break; } //AdjacencyListCapacity graph = Graphs.Cyclic8Nodes(); graph.mostrarListaAdyacencia(); initializeArrays(nodes); nInicial = Misc.validarNodosRecorrido(graph, "inicial"); nFinal = Misc.validarNodosRecorrido(graph, "final"); // :) // EdmondsKarp(graph, nInicial, nFinal, nodes); }
static void EdmondsKarp(AdjacencyListCapacity graph, int source, int sink, int nodos) { if (source == sink) { Console.WriteLine("No puedes visitarte a ti mismo"); return; } List <Vertice> pred = inicializarPred(nodos); int flujo = 0; Camino camino = new Camino(); //esto es bfs pero se agrega la decision de reconstruccion do { Queue <int> q = new Queue <int>(); q.Enqueue(source); //graph.mostrarListaAdyacencia(); while (q.Count > 0) { int cur = q.Dequeue(); int[] x = new int[] { 1, 2, 1, 3, 5 }; var vecinos = graph[cur]; foreach (var edge in vecinos) { if (pred[edge.sink] == null && edge.sink != source && edge.capacidad > edge.flujo) { pred[edge.sink] = edge; q.Enqueue(edge.sink); } } } if (pred[sink] != null) { int df = int.MaxValue; //Se busca en el pred[nullables] los nodos del camino //El df es el flujo/costo que puede pasar aka la resta de lo que lleva con lo que puede for (Vertice e = pred[sink]; e != null; e = pred[e.source]) { df = Math.Min(df, e.capacidad - e.flujo); } for (Vertice e = pred[sink]; e != null; e = pred[e.source]) { //Actualiza el flujo que pasa por este vertice e.flujo = e.flujo + df; //Actualiza el camino camino.agregarNodo(e.sink); camino.agregarCosto(e.capacidad); } //Se suma al flujo total flujo += df; } }while(pred[sink] == null); camino.agregarNodo(source); camino.mostrarCamino(); camino.mostrarCosto(); //Console.WriteLine($"Flujo Máximo {flujo}"); }
public static AdjacencyListCapacity crearGrafica(int nodos) { AdjacencyListCapacity g = new AdjacencyListCapacity(nodos); int vertices = Misc.obtenerNumero(" el número de vertices"); for (int i = 0; i < vertices; i++) { int nInicial = Misc.obtenerNumero(" el nodo"); int nAdyacente = Misc.obtenerNumero($" el nodo adyacente a el nodo {nInicial}"); int capacidad = Misc.obtenerNumero(" el costo de este vertice"); g.agregaVertice(nInicial, nAdyacente, capacidad, 0); } return(g); }
public static int validarNodosRecorrido(AdjacencyListCapacity graph, string nombre) { bool error = true; int nodo = -1; do { nodo = Misc.obtenerNumero($" el nodo {nombre} del recorrido"); try{ var x = graph[nodo]; error = false; }catch (Exception) { continue; } }while(error); return(nodo); }
public static AdjacencyListCapacity Cyclic8Nodes() { AdjacencyListCapacity h = new AdjacencyListCapacity(8); h.agregaVertice(0, 1, 3, 0); h.agregaVertice(0, 2, 5, 0); h.agregaVertice(0, 3, 2, 0); h.agregaVertice(0, 7, 10, 0); h.agregaVertice(1, 0, 3, 0); h.agregaVertice(1, 2, 5, 0); h.agregaVertice(1, 4, 4, 0); h.agregaVertice(1, 6, 6, 0); h.agregaVertice(1, 3, 8, 0); h.agregaVertice(1, 7, 6, 0); h.agregaVertice(2, 0, 5, 0); h.agregaVertice(2, 1, 5, 0); h.agregaVertice(2, 6, 9, 0); h.agregaVertice(2, 4, 1, 0); h.agregaVertice(2, 5, 7, 0); h.agregaVertice(3, 7, 14, 0); h.agregaVertice(3, 0, 2, 0); h.agregaVertice(3, 1, 8, 0); h.agregaVertice(3, 4, 12, 0); h.agregaVertice(4, 2, 1, 0); h.agregaVertice(4, 1, 4, 0); h.agregaVertice(4, 3, 12, 0); h.agregaVertice(4, 6, 15, 0); h.agregaVertice(5, 2, 7, 0); h.agregaVertice(5, 7, 9, 0); h.agregaVertice(6, 1, 6, 0); h.agregaVertice(6, 2, 9, 0); h.agregaVertice(6, 4, 15, 0); h.agregaVertice(6, 7, 3, 0); h.agregaVertice(7, 0, 10, 0); h.agregaVertice(7, 5, 9, 0); h.agregaVertice(7, 1, 6, 0); h.agregaVertice(7, 6, 3, 0); h.agregaVertice(7, 3, 14, 0); return(h); }