Пример #1
0
        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);
        }
Пример #2
0
        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}");
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }