Algoritmo de Dijkstra
#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. */
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 [c]Código en C[/c]
- Si es lenguaje Pascal [pascal]Aquí dentro el código de Pascal[/pascal].
De esta manera el código coloreas el código.
Otro punto importante para muchos que sienten que se les ignora: 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 cambiar mis condiciones en el momento que así lo requiera.
¿estas de acuerdo? entonces adelante que ya te he quitado bastante tiempo leyendo esta basura de advertencias :)