static void rutaCorta(vertice origen, int distanciaTotal)
        {
            if (ultimoVertice == origen)
            {
                return;
            }

            if (origen.sigA.sigA == null)
            {
                Console.WriteLine(distanciaTotal + origen.sigA.distancia);
                //Console.WriteLine("\n" + "Origen: " + origen.numero + " Destino: " + origen.sigA.destino.numero + " Distancia: " + origen.sigA.distancia);
                return;
            }

            if (origen.sigA.distancia < origen.sigA.sigA.distancia)
            {
                //Console.WriteLine("\n" + "Origen: " + origen.numero + " Destino: " + origen.sigA.destino.numero + " Distancia: " + origen.sigA.distancia);
                rutaCorta(origen.sigA.destino, distanciaTotal + origen.sigA.distancia);
            }
            else
            {
                //Console.WriteLine("\n" + "Origen: " + origen.numero + " Destino: " + origen.sigA.sigA.destino.numero + " Distancia: " + origen.sigA.sigA.distancia);
                rutaCorta(origen.sigA.sigA.destino, distanciaTotal + origen.sigA.sigA.distancia);
            }
        }
示例#2
0
        public void rutaCorta(vertice tempVertice, int distancia, string ruta1)
        {
            string ruta2 = ruta1 + tempVertice.numero + ", ";                                           cantLineasR++; comparacionesR++;

            if (distancia > distanciaCorta)
            {
                cantLineasR++;
                return;
            }
            cantLineasR++; comparacionesR++;
            if (tempVertice.sigV == null)
            {
                ruta           = ruta2;
                distanciaCorta = distancia;                                                             asignacionesR++;
                return;
            }
            cantLineasR++; comparacionesR++;
            if (tempVertice.sigV.sigV == null)
            {
                cantLineasR += 2;
                rutaCorta(tempVertice.sigV, (distancia + tempVertice.sigA.distancia), ruta2);                  asignacionesR++;
                return;
            }
            cantLineasR += 2; asignacionesR += 2;
            rutaCorta(tempVertice.sigV, distancia + tempVertice.sigA.distancia, ruta2);
            rutaCorta(tempVertice.sigV.sigV, distancia + tempVertice.sigA.sigA.distancia, ruta2);
        }
        static public void crearArco(int origen, int destino, int distancia)
        {
            vertice verticeO = buscarV(origen);
            vertice verticeD = buscarV(destino);

            if (verticeO == null && verticeD == null)
            {
                Console.WriteLine("Un vertice no existe");
            }
            else
            {
                arco nuevoArco = new arco();
                nuevoArco.distancia = distancia;
                nuevoArco.destino   = verticeD;

                if (verticeO.sigA == null)
                {
                    verticeO.sigA = nuevoArco;
                }
                else
                {
                    arco tempA = verticeO.sigA;
                    while (tempA.sigA != null)
                    {
                        tempA = tempA.sigA;
                    }
                    tempA.sigA = nuevoArco;
                }
            }
        }
示例#4
0
        static public void crearMatriz()
        {
            matrizValores = new int[cantVertices, cantVertices];
            int     columna = 1;
            int     fila    = 0;
            vertice tempV   = primerVertice;
            arco    tempA;

            for (int i = 0; i < cantVertices; i++)
            {
                for (int j = 0; j < cantVertices; j++)
                {
                    matrizValores[i, j] = 99999;
                }
            }
            while (tempV != null)
            {
                tempA = tempV.sigA;
                while (tempA != null)
                {
                    matrizValores[fila, columna] = tempA.distancia;
                    columna++;
                    tempA = tempA.sigA;
                }
                columna--;
                fila++;
                tempV = tempV.sigV;
            }
        }
        static public void imprimirVertices()
        {
            vertice tempV = primerVertice;

            while (tempV != null)
            {
                Console.Write(tempV.numero);
                tempV = tempV.sigV;
            }
        }
        public void rutaCor(vertice tempVertice)
        {
            vertice tempV = tempVertice;

            while (true)
            {
                ruta = ruta + tempV.numero + ", "; comparacionesC++; asignacionesC++;
                if (tempV.sigV == null)
                {
                    comparacionesC++;
                    return;
                }
                else if (tempV.sigV.sigV == null)
                {
                    distancia += tempV.sigA.distancia;
                    tempV      = tempV.sigV; comparacionesC += 2; asignacionesC += 2; cantLineasC += 5;
                }

                else if (tempV.sigV.sigA.sigA == null)
                {
                    if (tempV.sigA.sigA.distancia < (tempV.sigA.distancia + tempV.sigV.sigA.distancia))
                    {
                        distancia += tempV.sigA.sigA.distancia;
                        tempV      = tempV.sigV.sigV; comparacionesC += 4; asignacionesC += 2; cantLineasC += 7;
                    }
                    else
                    {
                        distancia += tempV.sigA.distancia;
                        tempV      = tempV.sigV; comparacionesC += 3; asignacionesC += 2; cantLineasC += 7;
                    }
                }

                else if (tempV.sigA.sigA.distancia < (tempV.sigA.distancia + tempV.sigV.sigA.distancia))
                {
                    if ((tempV.sigA.distancia + tempV.sigV.sigA.sigA.distancia) <= (tempV.sigA.sigA.distancia + tempV.sigV.sigV.sigA.distancia))
                    {
                        distancia += tempV.sigA.distancia;
                        tempV      = tempV.sigV; comparacionesC += 5; asignacionesC += 2; cantLineasC += 8;
                    }
                    else
                    {
                        distancia += tempV.sigA.sigA.distancia;
                        tempV      = tempV.sigV.sigV; comparacionesC += 4; asignacionesC += 2; cantLineasC += 8;
                    }
                }
                else
                {
                    distancia += tempV.sigA.distancia;
                    tempV      = tempV.sigV; comparacionesC += 4; asignacionesC += 2; cantLineasC += 8;
                }
            }
        }
        static public void imprimir()
        {
            vertice tempV = primerVertice;
            arco    tempA;

            while (tempV != null)
            {
                Console.Write("---------------------" + "\r\n");
                Console.Write("Vertice " + tempV.numero + "\r\n");
                tempA = tempV.sigA;
                while (tempA != null)
                {
                    Console.Write("Ruta " + tempA.destino.numero + " distancia " + tempA.distancia + "\r\n");
                    tempA = tempA.sigA;
                }
                tempV = tempV.sigV;
            }
        }
        static vertice buscarV(int numero)
        {
            if (primerVertice == null)
            {
                return(null);
            }
            vertice tempV = primerVertice;

            while (tempV != null)
            {
                if (tempV.numero == numero)
                {
                    return(tempV);
                }
                tempV = tempV.sigV;
            }

            return(null);
        }
示例#9
0
        static public void insertarVertice(int numero)
        {
            vertice nuevoVertice = new vertice();

            nuevoVertice.numero = numero;
            if (primerVertice == null)
            {
                primerVertice = nuevoVertice;
            }
            else
            {
                vertice tempV = primerVertice;
                while (tempV.sigV != null)
                {
                    tempV = tempV.sigV;
                }
                tempV.sigV = nuevoVertice;
            }
        }
        static public void crearMatriz()
        {
            matrizValores = new int[cantVertices, cantVertices];
            int columna = 1;
            int fila    = 0;

            vertice tempV = primerVertice;
            arco    tempA;

            for (int i = 0; i < cantVertices; i++)
            {
                for (int j = 0; j < cantVertices; j++)
                {
                    matrizValores[i, j] = 99;
                }
            }

            while (tempV != null)
            {
                tempA = tempV.sigA;
                while (tempA != null)
                {
                    matrizValores[fila, columna] = tempA.distancia;
                    columna++;
                    tempA = tempA.sigA;
                }
                columna--;
                fila++;
                tempV = tempV.sigV;
            }
            for (int i = 0; i < cantVertices; i++)
            {
                for (int j = 0; j < cantVertices; j++)
                {
                    Console.Write(String.Format("{0,5:0}", matrizValores[i, j]));
                }
                Console.Write("\r\n");
            }
        }
示例#11
0
        static public void crearArco(int origen, int destino, int distancia)
        {
            vertice verticeO  = buscarV(origen);
            vertice verticeD  = buscarV(destino);
            arco    nuevoArco = new arco();

            nuevoArco.distancia = distancia;
            nuevoArco.destino   = verticeD;

            if (verticeO.sigA == null)
            {
                verticeO.sigA = nuevoArco;
            }
            else
            {
                arco tempA = verticeO.sigA;
                while (tempA.sigA != null)
                {
                    tempA = tempA.sigA;
                }
                tempA.sigA = nuevoArco;
            }
        }
        static void Main(string[] args)
        {
            primerVertice = null;
            crearGrafo();

            /*crearMatriz();
             * imprimir();
             * Dijkstra prueba = new Dijkstra((int)Math.Sqrt(matrizValores.Length), matrizValores);
             * prueba.CorrerDijkstra();
             *
             * Console.WriteLine("La solucion de la ruta mas corta tomando como nodo inicial el NODO 1 es: ");
             * int nodo = 1;
             *
             * foreach(int i in prueba.D)
             * {
             *  Console.Write("Distancia minima a nodo " + nodo + " es ");
             *  Console.WriteLine(i);
             *  nodo++;
             * }
             * Console.WriteLine( );
             * Console.WriteLine("Presione la tecla Enter para salir.");
             *
             * crearMatrizFloyd();
             *
             * floyd prueba2 = new floyd();
             * prueba2.PrintMatrix(prueba2.FloydAlgorithm(matrizFloyd));
             */

            rutaCorta(primerVertice, 0);

            Console.WriteLine();



            //imprimirVertices();
            Console.ReadKey();
        }
示例#13
0
        static void Main(string[] args)
        {
            primerVertice = null;

            crearGrafo();
            crearMatriz();
            crearMatrizFloyd();

            Stack     pila2 = new Stack();;
            Stopwatch tiempo;

            tiempo = Stopwatch.StartNew();
            dijkstra prueba1 = new dijkstra((int)Math.Sqrt(matrizValores.Length), matrizValores);

            prueba1.correrDijkstra();
            tiempoT = tiempo.ElapsedMilliseconds;

            Console.WriteLine("La solucion de la ruta mas corta en Dijkstra es : " + prueba1.D[cantVertices - 1]);
            Console.WriteLine("\r\n" + "Asignaciones Dijkstra: " + prueba1.asignacionesD + "\r\n" + "Comparaciones Dijkstra: " + prueba1.comparacionesD);
            Console.WriteLine("\r\n" + "Tiempo ejecucion: " + tiempoT + " Milisegundos");
            Console.WriteLine("\r\n" + "Cantidad de lineas ejecutadas: " + prueba1.cantLineasD + "\r\n");
            int nodo = 1;

            foreach (int i in prueba1.D)
            {
                Console.Write("Distancia minima a nodo " + nodo + " es ");
                Console.WriteLine(i);
                nodo++;
            }
            Console.WriteLine("\r\n" + "--------------------------------------------------------------------------------");


            floyd prueba2 = new floyd();

            matrizFloyd = prueba2.correrfloyd(matrizFloyd);
            tiempo      = Stopwatch.StartNew();
            prueba2.rutaCor(primerVertice);
            tiempoT = tiempo.ElapsedMilliseconds;

            Console.WriteLine("\r\n" + "La solucion de la ruta mas corta en Floyd es : " + matrizFloyd[0, cantVertices - 1]);
            Console.WriteLine("\r\n" + "Asignaciones Floyd: " + prueba2.asignacionesF + "\r\n" + "Comparaciones Floyd: " + prueba2.comparacionesF);
            Console.WriteLine("\r\n" + "Tiempo ejecucion: " + tiempoT + " Milisegundos");
            Console.WriteLine("\r\n" + "Cantidad de lineas ejecutadas: " + prueba2.cantLineasF + "\r\n");

            for (int x = 0; x < prueba2.dist.GetLength(0); x++)
            {
                for (int y = 0; y < prueba2.dist.GetLength(0); y++)
                {
                    if (prueba2.dist[x, y] == 99999)
                    {
                        Console.Write(String.Format("{0,5:0}", "++"));
                    }
                    else
                    {
                        Console.Write(String.Format("{0,5:0}", prueba2.dist[x, y]));
                    }
                }
                Console.WriteLine();
            }

            Console.WriteLine("\r\n" + "--------------------------------------------------------------------------------");

            Console.WriteLine("\r\n" + "La solucion de la ruta mas corta con el Iterativo es : " + prueba2.distancia);
            Console.WriteLine("\r\n" + "Asignaciones Iterativo: " + prueba2.asignacionesC + "\r\n" + "Comparaciones Iterativo: " + prueba2.comparacionesC);
            Console.WriteLine("\r\n" + "Tiempo ejecucion: " + tiempoT + " Milisegundos");
            Console.WriteLine("\r\n" + "Cantidad de lineas ejecutadas: " + prueba2.cantLineasC);
            Console.WriteLine("\r\n" + "Ruta mas corta: " + prueba2.ruta);
            Console.WriteLine("\r\n" + "--------------------------------------------------------------------------------");

            recursivo prueba3 = new recursivo();

            tiempo = Stopwatch.StartNew();
            prueba3.rutaCorta(primerVertice, 0, "");
            tiempoT = tiempo.ElapsedMilliseconds;
            Console.WriteLine("\r\n" + "La solucion de la ruta mas corta en el metodo Recursivo es : " + prueba3.distanciaCorta);
            Console.WriteLine("\r\n" + "Asignaciones Recursivo: " + prueba3.asignacionesR + "\r\n" + "Comparaciones Recursivo: " + prueba3.comparacionesR);
            Console.WriteLine("\r\n" + "Tiempo ejecucion: " + tiempoT + " Milisegundos");
            Console.WriteLine("\r\n" + "Cantidad de lineas ejecutadas: " + prueba3.cantLineasR);
            Console.WriteLine("\r\n" + prueba3.ruta);
            Console.WriteLine("\r\n" + "--------------------------------------------------------------------------------");
            //foreach (Object obj in prueba3.pila)
            //{
            //    Console.Write("    {0}", obj);
            //}

            //for (int i = 1; i < prueba1.D.Length; i++)
            //{
            //    Console.Write(i + "= " + prueba1.D[i] + ", ");
            //}

            Console.ReadKey();
        }