void inicializaVD(Vertice v_inicial) { //Para cada vertice del grafo, creo de el un elemento de dijkstra foreach (Vertice v in listaVertices) { elementoDij e_di = new elementoDij(v, null, double.MaxValue, false, v.getId()); //< Vertice, peso, definitivo, id elementoDList.Add(e_di); } // e_inicial{v_inicial, 0, noDefinitivo} // Busco el vertice que coincide con el inicial y hago lo de arriba elementoDij e_d; for (int i = 0; i < elementoDList.Count; i++) { e_d = elementoDList[i]; e_d.setVertice(elementoDList[i].getVEDJ()); if (e_d.getVEDJ() == v_inicial) { elementoDij nuevo = new elementoDij(v_inicial, v_inicial, 0, false, v_inicial.getId()); //e_d = nuevo; elementoDList[i] = nuevo; break; } } }
/////////// ALGORITMO /////////// void DijkstraA(Vertice v_inicial, Vertice destino) { elementoDij e_d = new elementoDij(null, null, double.MaxValue, false, 0); //< Dummy inicializaVD(v_inicial); /*while(!solucion(destino)){ * e_d = seleccionaDefinitivo(); * actualiza(e_d); * }*/ while (!solucion()) { e_d = seleccionaDefinitivo(); actualiza(e_d); } }
void actualiza(elementoDij e_d) { int posED = 0; foreach (Arista a_i in e_d.getVEDJ().getLA()) //< Consigo los adyacentes del elementoDIJK mediante la lista de aristas // Si el el destino de la arista da con el elemento, asigno el elemento al nuevo elemento { posED = buscaElemento(a_i.getDestino().getId()); //< Posicion de mi elemento a actualizar elementoDij e_i = elementoDList[posED]; //< lo asigno a un temporal //Si el peso de ti temporal es mayor al nuevo peso lo cambio y lo agrego de nuevo a la lista en la posicion if (e_i.getPeso() > (e_d.getPeso() + a_i.getDistancia())) { e_i.setPeso((e_d.getPeso() + a_i.getDistancia())); e_i.setVerticeProv(e_d.getVEDJ()); elementoDList[posED] = e_i; } } }
elementoDij seleccionaDefinitivo() { //Devuelve el vertice del elemento Dijkstra que tenga el peso menor y que no sea definitivo, lo hace definitivo double min = double.MaxValue; elementoDij posible = new elementoDij(null, null, double.MaxValue, false, 100); //< Elemento dummy elementoDij e_d; for (int i = 0; i < elementoDList.Count; i++) { e_d = elementoDList[i]; if (!e_d.esDefininito()) { if (e_d.getPeso() < min) { min = e_d.getPeso(); //< Actualizo el peso minimo posible = e_d; //< Lo asigno a mi candidato } } } posible.setDefinitivo(true); return(posible); //< Le asigno definitivo y lo regreso }