236
TÉCNICAS DE DISEÑO DE ALGORITMOS
[1,–,–,–,–]1 [1,0,–,–,–]7
[–,–,–,–,–]0
[0,1,–,–,–]13
[0,–,–,–,–]12
[1,0,1,–,–]8 [1,0,0,–,–]9 [0,1,1,–,–]14 [0,1,0,–,–]15
[0,0,1,–,–]19 [0,0,–,–,–]18 [0,0,0,–,–]23
[1,0,0,1,–]10 [1,0,0,0,–]11 [0,1,0,1,–]16 [0,1,0,0,–]17 [0,0,1,1,–]20
[0,0,1,1,0]21
[0,0,1,0,–]22 [0,0,0,1,–]24 [0,0,0,0,–]25
cuyas soluciones son [1,1,0,1,0] y [0,0,1,1,0]. Para finalizar, el algoritmo ha de invocarse inicialmente desde el programa principal como Subconjuntos(s,1,r), donde s = 0 y r es igual a la suma de todos los elementos del conjunto.
6.10 CICLOS HAMILTONIANOS. EL VIAJANTE DE COMERCIO Dado un grafo conexo, se llama Ciclo Hamiltoniano a aquel ciclo que visita exactamente una vez cada vértice del grafo y vuelve al punto de partida. El problema consiste en detectar la presencia de ciclos Hamiltonianos en un grafo dado. Solución
(
)
Suponiendo como hemos hecho hasta ahora que los vértices del grafo están numerados desde 1 hasta n, la solución al problema puede expresarse como una n-tupla de valores X = [x1, x2, ..., xn], donde xi representa el i-ésimo vértice del ciclo Hamiltoniano. El algoritmo que resuelve el problema trabajará por etapas, decidiendo en cada etapa qué vértice del grafo de los aún no considerados puede formar parte del ciclo. Así, el algoritmo que resuelve el problema puede ser implementado como sigue: CONST n = ...; (* numero de vertices *) TYPE SOLUCION = ARRAY[1..n] OF CARDINAL; GRAFO = ARRAY[1..n],[1..n] OF BOOLEAN; VAR g:GRAFO; X:SOLUCION; existe:BOOLEAN; PROCEDURE Hamiltoniano1(k:CARDINAL; VAR existe:BOOLEAN); (* comprueba si existe un ciclo Hamiltoniano *) BEGIN