Algoritmo de Dijkstra
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #define INFINITY (MAX_INT - 1) typedef struct { int weight; int dest;} DijkEdge; typedef struct { DijkEdge* connections; /* Un array de arcos */ int numconnect; int distance; int isDead; } Vertex; void Dijkstra(Vertex* graph, int nodecount, int source) { for(int i = 0; i < nodecount; i++) { if(i == source) { graph[i].distance = 0; graph[i].isDead = 0; } else { graph[i].distance = INFINITY; graph[i].isDead = 0; } } for(int i = 0; i < nodecount; i++) { int next; int min = INFINITY+1; for(int j = 0; j < nodecount; j++) { if(!graph[j].isDead && graph[j].distance < min) { next = j; min = graph[j].distance; } } for(int j = 0; j < graph[next].numconnect; j++) { if(graph[graph[next].connections[j].dest].distance > graph[next].distance + graph[next].connections[j].weight) { graph[graph[next].connections[j].dest].distance = graph[next].distance + graph[next].connections[j].weight; } } graph[next].isDead = 1; } for(int i = 0; i < nodecount; i++) { printf("The distance between nodes %i and %i is %i", source, i, graph[i].distance); } } /* * Sea G=(V,A) un grafo dirigido y etiquetado. * Sean los vértices a ∈ V y z ∈ V; a es el vértice de origen y z el vértice de destino. * Sea un conjunto C ⊂ V, que contiene los vértices de V cuyo camino más corto desde a todavÃÂÂa no se conoce. * Sea un vector D, con tantas dimensiones como elementos tiene V, y que “guardaâ€Â? las distancias entre a y cada uno de los vértices de V. * Sea, finalmente, otro vector, P, con las mismas dimensiones que D, y que conserva la información sobre qué vértice precede a cada uno de los vértices en el camino. El algoritmo para determinar el camino de longitud mÃÂÂnima entre los vértices a y z es: 1. C ← V 2. Para todo vértice i ∈ C, i ≠ a, se establece Di ← ∞ ; Da ← 0 3. Para todo vértice i ∈ C se establece Pi = a 4. Se obtiene el vértice s ∈ C tal que no existe otro vértice w ∈ C tal que Dw < Ds * Si s = z entonces se ha terminado el algoritmo. 5. Se elimina de C el vértice s: C ← C−{s} 6. Para cada arista e ∈ A de longitud l, que une el vértice s con algún otro vértice t ∈ C, * Si l+Ds < Dt, entonces: 1. Se establece Dt ← l+Ds 2. Se establece Pt ← s 7. Se regresa al paso 4 Al terminar este algoritmo, en Dz estará guardada la distancia mÃÂÂnima entre a y z. Por otro lado, mediante el vector P se puede obtener el camino mÃÂÂnimo: en Pz estará y, el vértice que precede a z en el camino mÃÂÂnimo; en Py estará el que precede a y, y asàsucesivamente, hasta llegar a a.*/ |
1 comentarios en "Algoritmo de Dijkstra"
Antes de comentar: Gran parte de los ejercicios propuestos no tienen librerías debido a que Wordpress las eliminó al verlas como etiquetas HTML. Si sabes/tienes/conoces las librerías que hacen falta, déjalo en los comentarios. Y lo mas importante: Todos los ejemplos fueron realizados por personas con únicamente conocimiento básico del lenguaje, no de programación.
Otro punto importante: Si vas a sugerir un segmento de código en algún lenguaje debes hacerlo así:
- Si es lenguaje C <code lang="c">Código en C</code>
- Si es lenguaje Pascal <code lang="pascal">Aquí dentro el código de Pascal</code>.
De esta manera el código coloreas el código.
Otro punto importante para muchos que crees que te he ignorado: Todos los comentarios los reviso y en su debido momento los apruebo, pero ojo con el con lo siguiente:Me reservo el derecho de alterar, publicar o no los comentarios así como también cambiar mis condiciones en el momento que yo lo requiera.
¿Si estas de acuerdo? Adelante! que ya te he quitado bastante tiempo leyendo esta basura :)
julio
2010-05-25 22:25:53
no ase falta otra solo limits.h