public ListD <Vertex <T> > MiniDijkstraWay(string pNombreVerticeA, string pNombreVerticeB) { if (pNombreVerticeA != pNombreVerticeB && !IsGuide) { if (this.NegativeWeightatEdge()) { throw new Exception("Existe algun valor negativo en el peso de los arcos"); } HashTable <String, int> costosFinales = GetHashTableByDijkstra(); HashTable <String, int> costosTemporales = GetHashTableByDijkstra(); string clave = null; this.CleanVerticeVisit(); ListD <Vertex <T> > ListaAuxiliarDSucesores, ListaSucesores = this.GetListaSuccessors(pNombreVerticeA); Vertex <T> verticeActual = this.GetVertexByName(pNombreVerticeA); verticeActual.IsVisit = true; Edge <T> arco = null; int peso = 0, costo = 0; Iterator <Vertex <T> > iterador = new Iterator <Vertex <T> >(ListaSucesores.GetCabeza()); bool noSalir = true; costosTemporales.ActualizarDatoPorClave(pNombreVerticeA, 0); costosFinales.ActualizarDatoPorClave(pNombreVerticeA, 0); while (noSalir) { for (Vertex <T> verticeAdyac = iterador.Next(); verticeAdyac != null; verticeAdyac = iterador.Next()) { arco = GetEdge(verticeActual.Name, verticeAdyac.Name); if (arco != null) { costo = (int)arco.GetWeight() + peso; if (costosTemporales.SearchByKey(arco.GetVertB().Name) > costo || costosTemporales.SearchByKey(arco.GetVertB().Name) == -1) { costosTemporales.ActualizarDatoPorClave(arco.GetVertB().Name, costo); } } } int index = -1, auxiliar = 0; clave = null; for (int i = 0; i < costosTemporales.GetSize(); i++) { clave = costosTemporales.GetClave(i); if ((auxiliar == 0 || auxiliar > costosTemporales.GetForIndex(i)) && (costosTemporales.GetForIndex(i) >= 0 && clave != null)) { if (!VerticesGroup.SearchByKey(clave).IsVisit) { auxiliar = costosTemporales.GetForIndex(i); index = i; } } } if (index != -1) { clave = costosTemporales.GetClave(index); costosFinales.UpdateByIndex(index, auxiliar); verticeActual = VerticesGroup.SearchByKey(clave); verticeActual.IsVisit = true; } else { if (StopAnalisis()) { noSalir = false; } } ListaAuxiliarDSucesores = this.GetListSuccessorNotVisited(clave); if (ListaAuxiliarDSucesores.GetCabeza() != null) { ListaSucesores = ListaAuxiliarDSucesores; } peso = auxiliar; index = -1; auxiliar = 0; iterador = new Iterator <Vertex <T> >(ListaSucesores.GetCabeza()); } ListD <Vertex <T> > ListaCaminoCorto = GetCaminoMinimo(costosFinales, pNombreVerticeB); return(ListaCaminoCorto); } return(null); }
public Lista <Vertice <T> > RutaMinimaDijkstra(string pNombreVerticeA, string pNombreVerticeB) { if (pNombreVerticeA != pNombreVerticeB && !EsDirigido) { if (this.HayPesosNegativosEnArcos()) { throw new Exception("Existe algun valor negativo en el peso de los arcos"); } TablaHash <String, int> costosFinales = GetTablasHashParaDijkstra(); TablaHash <String, int> costosTemporales = GetTablasHashParaDijkstra(); string clave = null; this.LimpiaVisitasVertices(); Lista <Vertice <T> > ListaAuxiliarDSucesores, ListaSucesores = this.GetListaSucesores(pNombreVerticeA); Vertice <T> verticeActual = this.GetVerticePorNombre(pNombreVerticeA); verticeActual.EsVisit = true; Arista <T> arco = null; int peso = 0, costo = 0; Iterador <Vertice <T> > iterador = new Iterador <Vertice <T> >(ListaSucesores.GetCabeza()); bool noSalir = true; costosTemporales.ActualizarDatoPorClave(pNombreVerticeA, 0); costosFinales.ActualizarDatoPorClave(pNombreVerticeA, 0); while (noSalir) { for (Vertice <T> verticeAdyac = iterador.Next(); verticeAdyac != null; verticeAdyac = iterador.Next()) { arco = GetArco(verticeActual.Nombre, verticeAdyac.Nombre); if (arco != null) { costo = (int)arco.GetPeso() + peso; if (costosTemporales.BuscaHashPorClave(arco.GetVertB().Nombre) > costo || costosTemporales.BuscaHashPorClave(arco.GetVertB().Nombre) == -1) { costosTemporales.ActualizarDatoPorClave(arco.GetVertB().Nombre, costo); } } } int index = -1, auxiliar = 0; clave = null; for (int i = 0; i < costosTemporales.GetTamanio(); i++) { clave = costosTemporales.GetClave(i); if ((auxiliar == 0 || auxiliar > costosTemporales.GetForIndex(i)) && (costosTemporales.GetForIndex(i) >= 0 && clave != null)) { if (!ArregloDVertices.BuscaHashPorClave(clave).EsVisit) { auxiliar = costosTemporales.GetForIndex(i); index = i; } } } if (index != -1) { clave = costosTemporales.GetClave(index); costosFinales.ActualizarDatoPorIndex(index, auxiliar); verticeActual = ArregloDVertices.BuscaHashPorClave(clave); verticeActual.EsVisit = true; } else { if (DetenerAnalisis()) { noSalir = false; } } ListaAuxiliarDSucesores = this.GetListaSucesoresNoVisitados(clave); if (ListaAuxiliarDSucesores.GetCabeza() != null) { ListaSucesores = ListaAuxiliarDSucesores; } peso = auxiliar; index = -1; auxiliar = 0; iterador = new Iterador <Vertice <T> >(ListaSucesores.GetCabeza()); } Lista <Vertice <T> > ListaCaminoCorto = GetCaminoMinimo(costosFinales, pNombreVerticeB); return(ListaCaminoCorto); } return(null); }