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