예제 #1
0
        private TablaHash <String, int> GetTablasHashParaDijkstra()
        {
            TablaHash <String, int> tablasHas = new TablaHash <string, int>(ArregloDVertices.GetTamanio());
            string clave = null;

            for (int i = 0; i < this.ArregloDVertices.GetTamanio(); i++)
            {
                if (this.ArregloDVertices.GetForIndex(i) != null)
                {
                    clave = this.ArregloDVertices.GetForIndex(i).Nombre;
                    tablasHas.Insertar(clave, -1);
                }
            }
            return(tablasHas);
        }
예제 #2
0
        private Lista <Vertice <T> > GetCaminoMinimo(TablaHash <string, int> pVerticesFinales, string pVerticeDestino)
        {
            Lista <Vertice <T> > ListaCaminoCorto = new Lista <Vertice <T> >();

            ListaCaminoCorto.InsertarAlInicio(this.GetVerticePorNombre(pVerticeDestino));
            Lista <Vertice <T> >    ListaSucesores = this.GetListaSucesores(pVerticeDestino);
            Iterador <Vertice <T> > iterador       = new Iterador <Vertice <T> >(ListaSucesores.GetCabeza());
            Vertice <T>             verticeActual  = this.GetVerticePorNombre(pVerticeDestino);
            Arista <T> arco = null;
            int        pesoA, pesoB, pesoC, residuo;
            bool       noSalir = true;

            while (noSalir)
            {
                for (Vertice <T> verticeAdyac = iterador.Next(); verticeAdyac != null; verticeAdyac = iterador.Next())
                {
                    arco = GetArco(verticeActual.Nombre, verticeAdyac.Nombre);
                    if (arco != null)
                    {
                        pesoA   = (int)arco.GetPeso();
                        pesoB   = pVerticesFinales.BuscaHashPorClave(verticeActual.Nombre);
                        pesoC   = pVerticesFinales.BuscaHashPorClave(verticeAdyac.Nombre);
                        residuo = pesoB - pesoA;
                        if (residuo == pesoC || residuo == 0)
                        {
                            ListaCaminoCorto.InsertarAlInicio(arco.GetVertB());
                            verticeActual = verticeAdyac;
                            verticeAdyac  = null;
                            if (residuo == 0)
                            {
                                noSalir = false;
                            }
                        }
                    }
                }
                ListaSucesores = this.GetListaSucesores(verticeActual.Nombre);
                iterador       = new Iterador <Vertice <T> >(ListaSucesores.GetCabeza());
            }

            return(ListaCaminoCorto);
        }
예제 #3
0
 public Grafo()
 {
     ArregloDVertices   = new TablaHash <String, Vertice <T> >(40);
     MatrizDAdyacencias = new Arista <T> [TablaHash <String, Vertice <T> > .ObtenerPrimo(40), TablaHash <String, Vertice <T> > .ObtenerPrimo(40)];
 }
예제 #4
0
 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);
 }
예제 #5
0
 public Grafo(bool pDirigido)
 {
     this.EsDirigido    = pDirigido;
     ArregloDVertices   = new TablaHash <String, Vertice <T> >(40);
     MatrizDAdyacencias = new Arista <T> [TablaHash <String, Vertice <T> > .ObtenerPrimo(40), TablaHash <String, Vertice <T> > .ObtenerPrimo(40)];
 }