notasacmicpc_tayundako
DESCRIPTION
Ayuda para el acm, programacion de algoritmosTRANSCRIPT
-
Notas para el ACM ICPC
Octavio Alberto Agustn Aquino Ricardo Omar Chavez Garca Fernando Said Ramrez Garca
17 de octubre de 2005
Indice1. Trigonometra 1
2. Geometra analtica 22.1. Rectas, planos y crculos . . . . . . . . 22.2. Transformacion de coordenadas . . . . 22.3. Cuadraticas . . . . . . . . . . . . . . . 2
3. Geometra computacional 33.1. Triangulacion de polgonos . . . . . . . 33.2. Interseccion de segmentos . . . . . . . 33.3. Envolvente convexa . . . . . . . . . . . 43.4. Punto en polgono . . . . . . . . . . . . 43.5. Mnimo crculo encapsulador . . . . . . 4
4. Teora de numeros 44.1. Factoriales . . . . . . . . . . . . . . . . 44.2. Ternas pitagoricas . . . . . . . . . . . . 44.3. Algoritmo de Euclides . . . . . . . . . 4
4.3.1. Ciclos en sucesiones . . . . . . 54.4. Divisores de un numero . . . . . . . . . 54.5. Numeros primos . . . . . . . . . . . . . 64.6. Potencias y logaritmos discretos . . . . 64.7. Teorema chino del residuo . . . . . . . 6
5. Combinatoria 65.1. Objetos combinatorios . . . . . . . . . 65.2. Numeros combinatorios . . . . . . . . . 7
6. Metodos numericos 86.1. Interpolacion . . . . . . . . . . . . . . 86.2. Diferenciacion . . . . . . . . . . . . . . 86.3. Integracion . . . . . . . . . . . . . . . 86.4. Transformacion rapida de Fourier . . . 86.5. Algebra lineal . . . . . . . . . . . . . . 9
7. Probabilidad 9
8. Ordenamiento y busqueda 98.1. Algoritmos basados en comparaciones . 98.2. Algoritmos lineales . . . . . . . . . . . 108.3. Busqueda binaria . . . . . . . . . . . . 10
9. Programacion dinamica 109.1. Suma de subconjunto . . . . . . . . . . 109.2. Estructuras de Catalan optimas . . . . . 109.3. Mayor subsecuencia comun . . . . . . . 119.4. Distancia de edicion . . . . . . . . . . . 119.5. Mayor subsecuencia creciente o decre-
ciente . . . . . . . . . . . . . . . . . . 119.6. Conteo de cambio . . . . . . . . . . . . 12
10. Rastreo hacia atras 12
11. Algoritmos voraces 12
12. Teora de grafos 1212.1. Circuitos eulerianos . . . . . . . . . . . 1312.2. Recorridos . . . . . . . . . . . . . . . . 1312.3. Caminos mnimos . . . . . . . . . . . . 13
12.3.1. Con una sola fuente . . . . . . . 1312.3.2. Entre todos los pares . . . . . . 14
12.4. Ordenamiento topologico . . . . . . . . 1412.5. Mnimo arbol generador . . . . . . . . 1412.6. Grafos hamiltonianos . . . . . . . . . . 1512.7. Flujo maximo . . . . . . . . . . . . . . 15
13. Localizacion de patrones 1513.1. Algoritmo KMP . . . . . . . . . . . . . 1513.2. Deteccion de periodicidades . . . . . . 15
14. Cuestiones miscelaneas 16
1. TrigonometraTodo triangulo tiene un crculo inscrito tangente a sus
lados e interior a el, cuyo centro es el punto de intersec-cion de las bisectrices de los lados.
Todo triangulo tiene un crculo circunscrito que pasapor sus vertices. El punto de interseccion de las media-nas del triangulo es su centro de masa.
Sea el triangulo 4ABC con angulos A, B y C y seana, b y c los lados opuestos a dichos angulos, respecti-vamente. Sean hc, tc y mc las longitudes de la altura, labisectriz y la mediana que se originan en el vertice C,y sean r y R los sendos radios de los crculos inscrito y
1
-
circunscrito. Hagamos s = 12 (a + b + c). Se satisfacenlas siguientes relaciones.
c2 = a2 + b2 2ab cos C (1)a = b cos C + c cos B (2)
asen A =
bsen B =
csen C (3)
area = 12chc =12ab sen C (4)
= c2 sen A sen B
2 sen C = rs =abc4R (5)
=
s(s a)(s b)(s c) (6)r = c sen 12 A sen
12 B sec
12C (7)
= ab sen C2s = (s c) tan12C (8)
=(
1ha+ 1hb +
1hc
)1(9)
R = c2 sen C =abc
4 area (10)hc = a sen B = b sen A = 2 areac (11)
tc = 2aba+b cos12C =
ab
(1 c2(a+b)2
)(12)
mc =
12a
2 + 12b2 12c2 (13)
cos(x y) = cos(x) cos(y) sen(x) sen(y) (14)sen(x y) = cos(x) sen(y) sen(x) cos(y) (15)
tan 2x = 2 tan x1tan2 x (16)
sen x2 =
1cos x2 (17)
cos x2 =
1+cos x2 (18)
tan x2 =
1cos x1+cos x =
sen x1+cos x =
1cos xsen x (19)
2. Geometra analtica
2.1. Rectas, planos y crculos
Escribimos [p1, p2, p3] =
x1 y1 z1x2 y2 z2x3 y3 z3
donde pi =(xi, yi, zi). El area signada de un triangulo con verticesen p1 = (x1, y1), p2 = (x2, y2) y p3 = (x3, y3) es
K({pi}3i=1) =[q1, q2, q3]
2=
12
x2 x1 y2 y1x3 x1 y3 y1 (20)
donde qi = (xi, yi, 1). La funcion K indica si el puntop3 se encuentra a la izquierda (K < 0), a la derecha(K > 0) o es colineal (K = 0) con respecto al segmentodirigido p1 p2. Por lo tanto, la ecuacion de la recta Ax +By + C = 0 que pasa por los puntos (x1, y1) y (x2, y2)puede escribirse de la siguiente manera:
x y 1x1 y1 1x2 y2 1
= 0.
Cuadro 1: Ecuaciones de rectas
Condiciones Ecuacion B, pasa por A (r A) B = 0Pasa por A yB (r A) (B A) = 0 B, pasa por A (r A) B = 0
La distancia d de una recta Ax + By + C = 0 a unpunto dado (x1, y1) es d =
|Ax1+By1+C|A2+B2
.En general, el area de un polgono {pi}n1i=0 es
K({pi}n1i=0 ) =12
n1i=0
xi yixi+1 yi+1
donde los ndices se toman modulo el numero de verti-ces n del polgono.
El siguiente determinante indica si un punto p4 =(x4, y4) esta sobre (D = 0), dentro (D < 0) o fuera (D >0) del crculo determinado por los puntos p1 = (x1, y1),p2 = (x2, y2) y p3 = (x3, y3).
D =
x1 y1 x21 + y
21 1
x2 y2 x22 + y22 1
x3 y3 x23 + y23 1
x4 y4 x24 + y24 1
(21)=
x1 x4 y1 y4 (x1 x4)2 + (y1 y4)2x2 x4 y2 y4 (x2 x4)2 + (y2 y4)2x3 x4 y3 y4 (x3 x4)2 + (y3 y4)2
.
2.2. Transformacion de coordenadasSi los ejes coordenados giran un angulo en torno
al origen en sentido horario, la relacion entre el sistemaoriginal y el nuevo es(
)=
(cos sen sen cos
) (xy
). (22)
2.3. CuadraticasEl polinomio de segundo grado
Q(x, y) = Ax2 + Bxy +Cy2 + Dx + Ey + F = 0,
en donde B , 0, puede transformarse en otro de la for-ma
Q(, ) = A2 +C2 + D + E + F = 0
haciendo el cambio de variable (22) con parametro
=
12 arctan BAC si A , C,4 si A = C.
(23)
2
-
La forma polar de una conica de excentricidad e, cu-yo foco esta en el polo y a p unidades de la directriz,es
r =ep
1 + e cos( + ),
donde es el angulo que forman el eje polar y la lneaque une el foco y el polo, tomado en sentido horario. Sie = 1, tenemos una parabola; si e < 1, una elipse, y sie > 1, una hiperbola.
3. Geometra computacionalTeorema 3.1 (Pick). Sea P un polgono reticular, I(P)el numero de puntos reticulares interiores a el y F(P)los puntos reticulares en su frontera. Entonces
K(P) = I(P) +F(P)
2 1.
3.1. Triangulacion de polgonosUna oreja de un polgono P son tres vertices con-
secutivos que determinan un triangulo completamentecontenido en P. Todo polgono tiene al menos una ore-ja.
Algoritmo 3.1. Determina si tres puntos de un polgo-no son una oreja.Entrada: Tres puntos pi,p j,pk en un polgono P orde-
nado en sentido antihorario.Salida: Verdadero, si los puntos conforman una oreja.
Falso en otro caso.1: funcion O (pi, p j, pk, P)2: si K(pi, p j, pk) < 0 entonces3: devolver falso.4: para todo m , i, j, k hacer5: si pm 4pi p j pk entonces6: devolver falso.7: devolver verdadero.
Algoritmo 3.2 (Otectoma). Triangula un polgono Pde n vertices en tiempo O(n2).Entrada: Un polgono P = {pi}n1i=0Salida: Una triangulacion T .
1: T .2: para todo pi P hacer3: li (i 1) mod n, ri (i + 1) mod n.4: i n 1.5: mientras |T | < n 2 hacer6: i ri7: si O(li, i, ri, P) entonces8: T T {pli , pi, pri}.9: lri li, rli ri.
3.2. Interseccion de segmentosAlgoritmo 3.3. Determina si dos segmentos p0 p1 yq0q1 se intersectan usando (20).Entrada: Dos segmentos p0 p1 y q0q1.Salida: Verdadero si los segmentos se intersectan. Fal-
so en caso contrario.1: d1 sgn K(q0, q1, p0), d2 sgn K(q0, q1, p1).2: d3 sgn K(p0, p1, q0), d4 sgn K(p0, p1, q1).{sgn(x) = [x > 0] [x < 0].}
3: si (d1 d2 < 0) (d3 d4 < 0) entonces4: devolver verdadero.5: si no6: u mn(p0x , p1x),U max(p0x , p1x).7: v mn(p0y , p1y),V max(p0y , p1y).8: s mn(q0x , q1x), S max(q0x , q1x).9: t mn(q0y , q1y),T max(q0y , q1y).
10: si (d1 = 0) (p0 (s, S ) (t,T )) entonces11: devolver verdadero.12: si no si (d2 = 0) (p1 (s, S ) (t,T )) entonces13: devolver verdadero.14: si no si (d3 = 0) (q0 (u,U) (v,V)) entonces15: devolver verdadero.16: si no si (d4 = 0) (q1 (u,U) (v,V)) entonces17: devolver verdadero.18: devolver falso.
Sean s1 y s2 dos segmentos. Decimos que son com-parables si la lnea de barrido los intersecta, y que s1esta por arriba de s2 si su ordenada de interseccion es lamayor de ambas.
Algoritmo 3.4. Determina si un conjunto de segmentosse intersecta en tiempo O(n log n).Entrada: Un conjunto de segmentos S .Salida: Verdadero si hay intersecciones en S . Falso en
caso contrario.1: T .2: Ordenar los segmentos de S de izquierda a dere-
cha, de extremo izquierdo a derecho y de menor amayor ordenada.
3: para todo p P hacer4: si p es extremo izquierdo de un segmento s en-
tonces5: I(T, s).6: si A(T, s) s , o A(T, s) s ,
entonces7: devolver verdadero.8: si p es extremo derecho de un segmento s enton-
ces9: si A(T, s)A(T, s) , entonces
10: devolver verdadero.11: S(T, s).12: devolver falso.
3
-
3.3. Envolvente convexaAlgoritmo 3.5 (Graham). Calcula la envolvente con-vexa de un conjunto de puntos Q.Entrada: Un conjunto de puntos Q = {pi}mi=0 R2.Salida: El conjunto de vertices de la envolvente con-
vexa en la pila S .1: Sea p0 Q el punto de menores coordenadas.2: Sean p1 . . . pm los puntos restantes de Q or-
denados por angulo polar alrededor de p0. Si hayempates, quitar todos los de mismo angulo salvo elde mayor modulo.
3: Meter p0, p1, p2 en la pila S .4: para i 3 hasta m hacer5: mientras K(ptope(S )1, ptope(S ), pi) 0 hacer6: S(S ).7: M(S , pi).
3.4. Punto en polgonoLas operaciones en los ndices del polgono son
modulo el numero de vertices del mismo.
Algoritmo 3.6. Determina si un punto esta en el inte-rior de un polgono simple. Identificamos al punto (x, y)con (x, y, 1) y con (1, 0, 0).Entrada: Un punto p = (x0, y0, 1) y un polgono P.Salida: Verdadero si el punto esta en el polgono. Falso
en caso contrario.1: a falso.2: para todo pi pi+1 P hacer3: si ([p,, pi] < 0) , ([p,, pi+1] < 0) entonces4: si ([pi, pi+1, p] < 0) , ([pi, pi+1,] < 0) en-
tonces5: a a.6: si no si [pi, pi+1, p] = 0 xi x xi+1 entonces7: devolver verdadero.8: devolver a.
Algoritmo 3.7. Determina si un punto esta en el inte-rior de un polgono.Entrada: Un punto p = (x0, y0) y un polgono P.Salida: El ndice g del polgono alrededor de p. Si g =
0, p esta fuera del polgono.1: g 0.2: para todo pi pi+1 P hacer3: si yi y0 entonces4: si yi+1 > y0 entonces5: si K(pi, pi+1, p0) < 0 entonces6: g g + 1.7: si no8: si yi+1 y0 entonces9: si K(pi, pi+1, p0) > 0 entonces
10: g g 1.11: devolver g.
3.5. Mnimo crculo encapsuladorAlgoritmo 3.8. Para hallar el centro y el radiodel mnimo crculo encapsulador, invocamos a M-C(P, ).Entrada: Un conjunto de puntos P = {pi}ni=1.Salida: El centro c y radio r del mnimo crculo encap-
sulador.1: funcion MC(P, B)2: si |B| = 1 entonces3: devolver c b1 y r 0.4: si no si |B| = 2 entonces5: devolver c 12 (b1 + b2) y r
12d(b1, b2).
6: si no si |B| = 3 entonces7: Hacer c el centro del crculo circunscrito del
triangulo {b1, b2, b3}8: devolver c y r d(c, b1).9: c (,), r 0.
10: para todo pi P hacer11: si d(pi, c) > r entonces12: B B {pi}.13: MC(P, B).14: fin funcion
4. Teora de numeros
4.1. FactorialesLa mayor potencia de un primo p que divide a n! esp(n) =
blogp nck=1
npk
. En consecuencia, el numero Z de
ceros al final de n! es Z =blog5 nc
k=1
n5k
.
Teorema 4.1 (Wilson). Se satisface (p 1)! 1(mod p) si, y solo si, p es primo.
4.2. Ternas pitagoricasLas ternas pitagoricas son tripletes (u, v,w) N3 ta-
les que w2 = u2 + v2. Si u v w, entonces la tripletase dice primitiva. Toda terna primitiva es de la forma(u, v,w) = (x2 y2, 2xy, x2 + y2), donde y < x y x y.Aunque hay una infinidad de ternas que tienen esta for-ma, no todas son primitivas.
4.3. Algoritmo de EuclidesAlgoritmo 4.1 (Euclides). Calcula el maximo comundivisor de a y b.Entrada: a, b Z.
4
-
Salida: El maximo comun divisor de a y b.1: mientras a , 0 y b , 0 hacer2: si |a| > |b| entonces3: a a mod b.4: si no5: b b mod a.6: si a , 0 entonces7: devolver a.8: si no9: devolver b.
Algoritmo 4.2 (Blankinship). Calcula el m. c. d.(a, b) de a y b y la combinacion lineal ar + bs =(a, b).Entrada: a, b Z.Salida: El m. c. d. de a y b y r y s tales que ar + bs =
(a, b).1: funcion MCD(a,b)2: u 1, d a.3: si b = 0 entonces4: devolver (d, u, 0).5: si no6: v1 0, v3 b.7: mientras v3 , 0 hacer8: q bd/v3c, t3 d mod v3.9: t1 u qv1, u v1, d v3, v1 t1, v3 t3.
10: devolver (d, u, (d au)/b).
Con el algoritmo anterior puede resolverse una con-gruencia de la forma ax b mod m.
Algoritmo 4.3. Calcula una solucion de ax = bmod m.Entrada: a, b,m Z.Salida: Si existe, x tal que ax = b mod m. Si no, fal-
so.1: (d, x, y)MCD(a,m).2: si d\b entonces3: x x(b/d)4: para i = 0 hasta d 1 hacer5: devolver (x + imd ) mod m6: si no7: devolver falso.
Observese que podemos resolver la ecuaciondiofantica ax + my = b, obteniendo x con el algoritmoanterior y y = baxd , siempre que (a,m)\b.
4.3.1. Ciclos en sucesiones
Algoritmo 4.4 (Floyd). Encuentra un ciclo en una su-cesion definida a traves de ai+1 = f (ai), donde f : S S y S es finito.Entrada: Una sucesion finita {ai}i=1.
Salida: La longitud t del ciclo de a.1: a1, a1, t 0.2: repetir3: f (), f ( f ()), t t + 1.4: hasta que =
4.4. Divisores de un numeroTeorema 4.2. Sea n N y sea
n =s
i=1
pii (24)
su descomposicion en numeros primos. Entonces n tie-ne N =
si=1 (i + 1) divisores.
El menor divisor propio p de un numero n es primo.
Algoritmo 4.5 (Division exhaustiva). El siguiente al-goritmo halla el menor divisor de un numero ente-ro.Entrada: n N.Salida: El menor divisor d de n, o 1 si n = 1.
1: si n 0 (mod 2) entonces2: devolver 2.3: si n 0 (mod 3) entonces4: devolver 3.5: 0 2,1 4, d 5, i 0, q 25.6: mientras n mod d > 0 q n hacer7: q q + 2id + 4 + 12i, d d + i, i (i + 1)
mod 2.8: si q > n entonces9: devolver n.
10: devolver d.
Algoritmo 4.6 (Suma de divisores). Para obtener lasuma de los divisores propios de un numero, aprove-chamos la identidad
(n) =d\n
1
-
4.5. Numeros primosLos numeros Mp = 2p 1, con p primo, se denomi-
nan primos de Mersenne.
Teorema 4.3 (Lucas-Lehmer). Sea rn la sucesion de-finida a traves de r1 = 4, rn+1 = r2n 2. Entonces Mp esprimo si, y solo si, Mp/rp1.
Teorema 4.4 (Euclides). Si Mp es primo, entonces2p1(2p 1) es perfecto, y recprocamente.
Teorema 4.5. El numero de Fermat Fn = 22n+ 1 es
primo si, y solo si, 3Fn1
2 1 (mod Fn).
Del Teorema 4.7 se sigue que si p es un primo impary (a, p) = 1 entonces
ap1 1 (mod p). (25)
Todo numero que satisface (25) se dice un pseudo-primo para la base a. Los primos impares son pseu-doprimos para todas sus bases coprimas. Los numeroscompuestos que son pseudoprimos para todas sus basescoprimas se denominan numeros de Carmichael.
Teorema 4.6. El entero n > 1 con descomposicion (24)es un numero de Carmichael si, y solo si, i = 1 y (pi 1)/(n 1) para todo i = 1, . . . , s.
Algoritmo 4.7 (Eratostenes). Obtencion de los pri-mos hasta una cota dada por medio de una cri-ba.Entrada: Una cota N para obtener todos los primos
impares hasta 2N + 1.Salida: Un arreglo X tal que Xk = [2k+1 no es primo].
1: X (0, . . . , 0).2: para k 3 hasta
2N + 1 sumando 2 hacer
3: si X(k1)/2 = 0 entonces4: para i k2 hasta 2N + 1 sumando 2k hacer5: X(i1)/2 1.
4.6. Potencias y logaritmos discretosTeorema 4.7 (Euler). Para todo n > 1, a Zn, a(n) 1 (mod n), donde (n) es la cardinalidad del conjuntode numeros que son coprimos con n.
La funcion satisface (n) =s
i=1 pi1i (pi 1) =
n
p/n
(1 1p
).
Teorema 4.8. El grupo multiplicativo Zn es cclico si, ysolo si, n = 2,4,pe o 2pe para un primo impar p y algune Z positivo.
Teorema 4.9. Si Zn esta generado por g, entonces gx gy mod n si, y solo si, x y (mod (n))
Algoritmo 4.8 (Exponenciacion rapida). Calcula aben un semigrupo en tiempo O(log b).Entrada: a en un semigrupo S y b Z.Salida: ab.
1: r 1.2: mientras b > 0 hacer3: si b 1 mod 2 entonces4: r a r.5: a a a, b
b2
.
6: devolver r.
4.7. Teorema chino del residuo
Teorema 4.10. Sean a1, . . . , an,m1, . . . ,mn Z talesque los elementos de {mi}ni=1 son coprimos. Entonces elsistema x ak (mod mk), k = 1, . . . , n, tiene solu-cion.
Algoritmo 4.9 (Chino inductivo). Calcula una solu-cion al sistema del Teorema 4.10.Entrada: Dos conjunto de enteros: {mi}ni=1 coprimos a
pares y {xi}ni=1.Salida: x tal que x xi (mod mi).
1: m m1, x x1.2: para i 2 hasta k hacer3: (d, u, v) MCD(m,mi).4: x umxi + vmix,m mmi, x x mod m5: devolver x.
5. Combinatoria
Teorema 5.1 (Principio de inclusion y exclusion).Sea {Ai}ni=1 una coleccion de conjuntos. Sea P+(n) elconjunto de subconjuntos no vacos I de {1, . . . , n}. En-tonces
ni=1 Ai = IP+(n)(1)|I|+1 |iI Ai|.Teorema 5.2. Hay
(n+k1
k1
)formas de colocar n objetos
distinguibles en k cajas distinguibles.
Sea G un grupo que actua por la izquierda sobreun conjunto S . Para g S consideramos el conjuntoF(g) = {s S : gs = s}. La orbita de s S es elconjunto orb(s) = {gs : g G}.
Teorema 5.3 (Burnside). Sea G un grupo finito queactua sobre el conjunto S . El numero de orbitas de Gen S es 1|G|
gG |F(g)|.
5.1. Objetos combinatorios
Aqu T es un segmento inicial de N de longitud n.
6
-
Algoritmo 5.1 (sucesor, codigo Gray). Aqu se consi-dera el orden de cambio mnimo para los subconjuntosde T .
1: si |T | 0 mod 2 entonces2: U T{n}.3: si no4: j n.5: mientras j < T y j > 0 hacer6: j j 1.7: si j = 1 entonces8: devolver falso.9: U T{ j 1}.
10: T = U.11: devolver verdadero.
Algoritmo 5.2 (colocador, codigo Gray). Se conside-ra el orden de cambio mnimo para los subconjuntos deT .
1: b r 0.2: para i n 1 decreciendo hasta 0 hacer3: si n i T entonces4: b 1 b.5: si b = 1 entonces6: r r + 2i.7: devolver r.
Algoritmo 5.3 (extractor, codigo Gray). Se considerael orden de cambio mnimo para los subconjuntos deT .
1: T , b 0.2: para i n 1 decreciendo hasta 0 hacer3: b
r2i
4: si b , b entonces5: T T {n i}.6: b b, r r b2i.7: devolver T .
Algoritmo 5.4 (sucesor, k-subconjuntos). Calcula elsucesor de un k-subconjunto (combinacion) de T en or-den lexicografico.
1: U T, i k2: mientras ((i 1) (ti = n k + 1)) hacer3: i i 1.4: si i = 0 entonces5: devolver falso.6: si no7: para j i hasta k hacer8: u j ti + 1 + j i.9: devolver verdadero.
Algoritmo 5.5 (colocador, k-subconjuntos). Colocaun k-subconjunto (combinacion) de T en la posicionr.
1: t0 r 0.
2: para i n 1 hasta k hacer3: si ti1 + 1 ti 1 entonces4: b 1 b.5: para j ti1 + 1 hasta ti 1 hacer6: r r +
(n jki
)7: devolver r.
Algoritmo 5.6 (extractor, k-subconjuntos). Extraede la posicion r el k-subconjunto (combinacion) deT .
1: x 12: para i 1 hasta k hacer3: mientras
(nxki
) r hacer
4: r r (
nxki
), x x + 1.
5: ti x, x x + 1.6: devolver T .
Algoritmo 5.7 (extractor, permutaciones). Extrae dela posicion r una permutacion de T en orden lexico-grafico.
1: n 1.2: para j 1 hasta n 1 hacer3: d b r mod ( j1)!j! c, r r d j!, n j d + 14: para i n j + 1 hasta n hacer5: si i > d entonces6: i i + 1.7: devolver .
Algoritmo 5.8 (colocador, permutaciones). Colocaen la posicion r una permutacion de T en orden lexi-cografico.
1: r 0, .2: para j 1 hasta n hacer3: r r + ( j 1)(n j)!4: para i j + 1 hasta n hacer5: si i > j entonces6: i i 1.7: devolver r.
5.2. Numeros combinatorios1. Subconjuntos de k elementos de un conjunto de n
elementos:(
nk
).
Formula explcita:(
nk
)= n!k! (nk)! .
Recurrencia:(
n+1k
)=
(n
k1
)+
(nk
).
Valores iniciales:(
n0
)=
(nn
)= 1, n 0.
2. Permutaciones de n letras que tienen exactamentek ciclos:
[nk
].
Recurrencia:[
nk
]=
[n1k1
]+ (n 1)
[n1
k
]Valores iniciales:
[0k
]= [k = 0],
[n0
]= [n = 0].
7
-
3. Permutaciones de n letras que tienen exactamentek ascendentes:
nk
.
Recurrencia:
nk
= (k + 1)
n1
k
+ (n k)
n1k1
Valores iniciales:
0k
= [k = 0].
4. Particiones de un conjunto de n elementos en k cla-ses:
{nk
}.
Recurrencia:{
nk
}=
{n1k1
}+ k
{n1
k
}.
Valores iniciales:{
0k
}= [k = 0],
{n0
}= [n = 0].
5. Particiones p(n, k) de n cuya mayor parte es k.
Recurrencia: p(n, k) = p(n1, k1)+ p(nk, k).Valores iniciales: p(n, k) = 0 si n 0, k 0 o
k > n y p(1, 1) = 1.
6. Numeros de Catalan Cn.
Formula explcita: Cn = 1n+1(
2nn
).
Recurrencias: Cn+1 = 2(2n+1)n+2 Cn =n
k=0 CkCnk.
6. Metodos numericos
6.1. InterpolacionDados los puntos {(xi, yi)}ni=0, la recurrencia de Nevi-
lle
Qi, j(x) =(x xi j)Qi, j1(x) (x xi)Qi1, j1(x)
xi x j1
calcula el valor de la interpolacion polinomial de dichospuntos, usando como valores iniciales Qi,0 = yi.
6.2. DiferenciacionLa formula central de f para una funcion f
C3[a, b] con x h, x, x + h [a, b] es
f (x) f (x + h) f (x h)2h
=: fc(x, h),
con error O(h2). La formula central de f para una fun-cion f C5[a, b] con x2h, xh, x, x+h, x+2h [a, b]es
f (x) 8 fc(x, h) 2 fc(x, 2h),con error O(h4).
6.3. IntegracionAlgoritmo 6.1 (Metodo de Simpson adaptativo).En el siguiente algoritmo, definimos S (a, b, c, h) =h3 ( f (a) + 4 f (c) + f (b)).Entrada: Un intervalo de integracion [a, b], una fun-
cion f C4[a, b] y una tolerancia .
Salida: El valor de b
af (x) dx con la tolerancia esta-
blecida.1: funcion S( f , [a, b], )2: h ba2 , c =
b+a2 .
3: a1 a, b1 a2 c, b2 b.4: c1 = b1+a12 , c2 =
b2+a22 .
5: L = S (a1,b1,c1,h)+S (a2,b2,c2,h)2 .6: si 110 |L S (a, b)| < entonces7: devolver L.8: si no9: devolver S( f , [a1, b1], 2 )+S( f , [a2, b2],
2 ).
Sea f : R R. Supongamos que J 1 y que lospuntos {xk = a + kh} subdividen al intervalo [a, b] en2J = 2M intervalos de anchura h = ba2J . HaciendoT (0) = h2 ( f (a) + f (b)), la formula trapezoidal recurren-te es
T (J) =T (J 1)
2+ h
Mk=1
f (x2k1).
Iniciando la tabla RJ,0 = T (J), tenemos la recursion deRichardson
RJ,K =4KRJ,K1 RJ1,K1
4K 1 ,
que aproxima a b
af (x) dx con un error de truncamiento
de orden O(h2K+2) para R(J,K) cuando f C2K+2[a, b].
6.4. Transformacion rapida de FourierAlgoritmo 6.2. Transformacion rapida de Fou-rier.
1: funcion TRF(a)2: n |a| {n es una potencia de 2}3: si n = 1 entonces4: devolver a.5: para j 1 hasta n/2 hacer6: b j a2 j1, c j a2 j7: b TRF(b), c TRF(c).8: n exp
(2n
), n exp
(2n
).
9: 1.10: para j 1 hasta n/2 hacer11: aj bj + cj, aj+n/2+1 bj cj.12: n {Usar n para la inversa}
Algoritmo 6.3. Multiplicacion de polinomios conTRF.Entrada: Dos sucesiones a = {ak}n1k=0 y b = {bk}m1k=0
que son los coeficientes de los polinomios p(x) =n1k=0 akx
k y q(x) =m1
k=0 bkxk.
Salida: Una sucesion c = {ck}n1k=0 de los coeficientesdel polinomio p(x) q(x).
1: funcion MP(a, b)
8
-
2: ` dlog2(n + m)e3: para j n hasta 2` 1 hacer4: a j 0.5: para j m hasta 2` 1 hacer6: b j 0.7: =TRF(a), =TRF(b)8: para k = 0 hasta k = n 1 hacer9: k k k.
10: devolver cITRF().
6.5. Algebra linealAlgoritmo 6.4. Encuentra la descomposicion LUP deuna matriz A Mmn.
1: para i = 1 hasta n hacer2: [i] i3: para k 1 hasta n hacer4: p 05: para i k hasta n hacer6: si |aik| > p entonces7: p |aik|, k i.8: si p = 0 entonces9: error Matriz singular.
10: Intercambiar [k] [k].11: para i 1 hasta n hacer12: Intercambiar ak1 aki.13: para i k + 1 hasta n hacer14: aik aik/akk.15: para j k + 1 hasta n hacer16: ai j ai j aikak j.
Algoritmo 6.5. Resuelve el sistema Ax = b con la des-composicion LUP de A Mmn.
1: para i = 1 hasta n hacer2: yi b[i]
i1j=1 Li jy j.
3: para i = n hasta 1 hacer4: xi
yin
j=i+1 Ui j x jUi j
.
7. ProbabilidadTeorema 7.1 (Desigualdad de Markov). Sea t > 0 yX una variable aleatoria no negativa. Entonces P(X t) E(X)t .
Teorema 7.2 (Desigualdad de Chebyshev). Sea t > 0y X una variable aleatoria no negativa. Entonces P(|XE(X)| t) V(X)t2 .
Sean dos eventos A y B, con sendas probabilidadesP(A) y P(B).
1. La probabilidad condicional P(A|B) satisfaceP(A|B) = P(AB)P(B) .
2. Los eventos A y B son independientes si P(A|B) =P(A). Ademas, P(AB) = P(A) P(B).
3. Se satisface P(A B) = P(A) + P(B) P(A B).
Si X e Y son variables aleatorias independientes, condistribuciones f y g respectivamente, entonces la dis-tribucion de Z = X + Y es f g =
f (t)g(x t) dt.
8. Ordenamiento y busqueda
8.1. Algoritmos basados en comparacio-nes
En los algoritmos de esta seccion N es la cardinali-dad del conjunto L a ordenar.
Algoritmo 8.1 (Ordenamiento por insercion). Puedecalcular el numero mnimo de intercambios para orde-nar a L. En cada iteracion del ciclo externo los elemen-tos L0, . . . Li forman una lista ordenada.
1: 0.2: para i 1 hasta i < N hacer3: t Li, j i 1.4: mientras L j > t y j 0 hacer5: L j+1 L j, j j 1.6: L j+1 t, + 1.7: devolver .
Algoritmo 8.2 (Ordenamiento por fusion). Puedecalcular el numero mnimo de intercambios para orde-nar a L en tiempo O(n log n).
1: 0.2: funcion P(i, j).3: si i , j entonces4: p b i+ j2 c.5: P(i, p), P(p + 1, j).6: a 0, b 0, c 0.7: mientras (a < (p+ i 1)) (b < ( j p)) hacer8: si Li+a < Lp+1+b entonces9: c Li+a, a a + 1.
10: si no11: c Lp+i+b, b b + 1.12: + p + 1 (a + i). {Intercambio.}13: c c + 1.14: mientras i + a p hacer15: c Li+a, a a + 1, c b + 1.16: mientras p + 1 + b j hacer17: c Lp+1+b, b b + 1, c b + 1.18: para todo k, 0 k j i hacer19: Li+k = i.
Algoritmo 8.3. Algoritmo de ordenacion rapida deHoare. Se invoca con OR(0,N1).
9
-
1: funcion OR(i, j)2: d L j3: i 1, j, c 14: si i j entonces5: devolver .6: mientras c > 0 hacer7: mientras L < d hacer8: + 1.9: mientras L > d hacer
10: 1.11: si < entonces12: Intercambiar L L13: si no14: c 0.15: Intercambiar L L16: OR(i, 1), OR( + 1, j).
8.2. Algoritmos linealesAlgoritmo 8.4 (Conteo).Entrada: Un arreglo A a ordenar, y una cota para los
datos k.1: para i 1 hasta k hacer2: C[i] 0.3: para j 1 hasta longitud(A) hacer4: C[A[ j]] C[A[ j]] + 1.5: para i 2 hasta k hacer6: C[i] C[i] +C[i 1]7: para j = |A| decreciendo hasta 1 hacer8: B[C[A[ j]]] A[ j]9: C[A[ j]] C[A[ j]] 1
Algoritmo 8.5 (Cubeta). Ordena {Ai}ni=1 [0, 1) usan-do n subintervalos iguales de [0, 1).
1: para i 1 hasta n hacer2: Insertar A[i] en la lista B[bnA[i]c].3: para i 0 hasta n 1 hacer4: Ordenar la lista B[i] con insercion.5: Concatenar las listas B[0], . . . , B[n 1] en orden.
8.3. Busqueda binariaAlgoritmo 8.6 (busqueda binaria). Algoritmo quebusca una llave en un conjunto ordenado en tiempoO(log2 n).Entrada: La llave K para buscar, el lmite inferior i y
superior j donde se hara la busqueda.Salida: k tal que Lk = K o falso si no existe.
1: mientras j i > 1 hacer2: p = b j+i2 c.3: si Lp < K entonces4: i p.
5: si no6: j p.7: si Li = K entonces8: devolver i.9: si no si L j = K entonces
10: devolver j.11: si no12: devolver falso.
9. Programacion dinamica
9.1. Suma de subconjuntoAlgoritmo 9.1. Dado un conjunto de enteros positivos{a1, . . . , an}, queremos saber cuantos subconjuntos detal conjunto suman B. Definimos la recurrencia
m(1, j) = [ j = a1],m(i, j) = m(i 1, j) + [ j > ai]m(i 1, j ai) + [ j = ai],
para 2 i n y 1 j B. El valor de m(n, B) nos da larespuesta, calculando m tiempo O(nB).
1: para j 1 hasta B hacer2: m(1, j) [ j = a1].3: para i 2 hasta n hacer4: para j 1 hasta B hacer5: m(i, j) m(i 1, j) + [ j = ai].6: si j > ai entonces7: m(i, j) m(i, j) + m(i 1, j ai)
Algoritmo 9.2 (Recuperacion de un subconjunto).La tabla generada anteriormente da informacion sufi-ciente para encontrar un subconjunto en tiempo O(B),llamando a S(n, B).
1: funcion S(i, B)2: si m(i, B) = 0 entonces3: imprime No hay solucion.4: si no si B = ai entonces5: imprime ai.6: si no si B > ai entonces7: imprime ai.8: S(i 1, B ai).
9.2. Estructuras de Catalan optimasAlgoritmo 9.3 (Mnimo generico). Se le ajus-ta la relajacion apropiada al siguiente algorit-mo.
1: funcion M2: para i 1 hasta n 1 hacer3: Mi,i+1 0.4: para j 2 hasta n 1 hacer
10
-
5: para i 1 hasta n d hacer6: R(i, j).7: devolver M1,n
Algoritmo 9.4 (Relajacion). Si el problema es detriangulacion optima usamos:
F(i, j, k) =
12 |K(pi, p j, pk)| (Area),pi, p j + p j, pk + pk, pi (Permetro).donde , es una metrica adecuada. Si es de multipli-cacion optima de n matrices, usamos
F(i, j, k) = D(i) D( j) D(k)
donde la matriz i-esima es de dimension D(i)D(i+ 1)y 1 i n. Para el problema de secuencia optima decorte, tenemos
F(i, j, k) = C( j) C(i),
donde C(i) es el corte i-esimo.1: funcion R(i, j)2: Mi, j .3: para k i + 1 hasta j 1 hacer4: t F(i, j, k) + Mi,k + Mk, j.5: si Mi, j > t entonces6: Mi, j t, si, j k
Algoritmo 9.5 (Recuperacion de la secuencia). Pararecuperar la secuencia de pasos para obtener el mnimo,invocamos a S(s, 1, n).
1: funcion S(s, i, j)2: si i = j entonces3: imprime A+i.4: si no5: imprime (.6: S(s, i, si, j).7: S(s, si, j + 1, j).8: imprime ).
9.3. Mayor subsecuencia comunAlgoritmo 9.6 (Longitud de la mayor subsecuenciacomun).Entrada: Cadenas X e Y de sendas cardinalidades m y
n.Salida: La longitud de la M. S. C. en cm,n.
1: para i 1 hasta m hacer2: ci,0 0.3: para j 1 hasta n hacer4: c0, j 0.5: para i 1 hasta m hacer6: para j 1 hasta n hacer
7: si Xi1 = Y j1 entonces8: ci, j ci1, j1 + 1, bi, j 1.9: si no si ci1, j ci, j1 entonces
10: ci, j ci1, j, bi, j 2.11: si no12: ci, j ci, j1, bi, j 3.13: devolver cm,n
Algoritmo 9.7 (Recuperacion de la subsecuencia).Requiere que se haya ejecutado previamente el algo-ritmo anterior.
1: funcion S(i, j, X, b)2: si i = 0 j = 0 entonces3: devolver .4: si bi, j = 1 entonces5: S(i 1, j 1, X, b)6: imprime Xi1.7: si no si bi, j = 2 entonces8: S(i 1, j, X, b)9: si no
10: S(i, j 1, X, b)
9.4. Distancia de edicionSean m la matriz de costos mnimos de transforma-
cion y p la matriz de predecesores. Considerando que laoperacion 1 es cambiar, la 2 es insertar y la 3 es borrar,tenemos las siguientes condiciones iniciales
d0,0 = 0, d0, j = j, di,0 = i,p0,0 = 1, p0, j = 1, pi,0 = 2,
para 0 i |s1| y 0 j |s2|. Definamos
T1(i, j) = di1, j1 + [si , s j], (Cambiar)T2(i, j) = di, j1 + 1, (Insertar)T3(i, j) = di1, j + 1. (Borrar)
Las relaciones de recurrencia son:
di, j = mnk{Tk(i, j) : 1 k 3}, pi, j = k.
Tenemos que d|s1 |,|s2 | es la distancia de edicion.
9.5. Mayor subsecuencia creciente o de-creciente
Algoritmo 9.8. Dada la sucesion {Ai}ni=1, encuentra unasubsucesion {Aik}mk=1 que sea estrictamente creciente odecreciente de maxima cardinalidad.Entrada: Una sucesion {Ai}ni=1.Salida: Un conjunto de longitudes maximas ` y un
conjunto de predecesores .
11
-
1: para i 1 hasta n 1 hacer2: para j i + 1 hasta n hacer3: si A j > Ai y `i + 1 > ` j entonces4: ` j `i + 1, j i.
9.6. Conteo de cambioAlgoritmo 9.9.Entrada: Un conjunto M = {mi}ni=0 N y W N.Salida: El numero de submulticonjuntos de M que su-
man W.1: F0 12: para i 0 hasta n 1 hacer3: c Mi4: para j c hasta W hacer5: F j F j + F jc6: devolver FW .
10. Rastreo hacia atrasSolucion de un problema por rastreo hacia atras.
Algoritmo 10.1. Esquema para una solu-cion.
procedimiento Ensayar(paso : TipoPaso)repetir
Seleccionar candidato.si aceptable entonces
Anotar candidato.si solucion incompleta entonces
Ensayar(paso siguiente)si no acertado entonces
Borrar candidato.si no
Anotar solucion.Hacer acertado cierto.
hasta que acertado=cierto o no haya candidatosfin procedimiento
Algoritmo 10.2. Esquema para todas las solucio-nes.
procedimiento Ensayar(paso : TipoPaso)para todo candidato hacer
Seleccionar candidato.si aceptable entonces
Anotar candidato.si solucion incompleta entonces
Ensayar(paso siguiente).si no
Almacenar solucion.Borrar candidato.
fin procedimiento
11. Algoritmos voracesAlgoritmo 11.1 (Mochila continua).Entrada: Un conjunto {(si,wi)}ni=1 de pares ordenados
de reales positivos y un objetivo S .Salida: Un conjunto {xi}ni=1 tal que S =
ni=1 xisi yn
i=1 xiwi es mnimo.1: Ordenar {(si,wi)}ni=1 segun wi/si en forma no decre-
ciente.2: s S , i 1.3: mientras si s hacer4: xi 1, s = s si, i i + 1.5: xi s/si.6: para j i + 1 hasta n hacer7: x j 0.
Algoritmo 11.2 (Mochila 0-1). Si tenemos n objetoscon pesos Wi y valores Vi con 1 i n y una mochilacon capacidad w. Que objetos debemos meter en lamochila para maximizar el valor de lo que contiene? Lasolucion se puede encontrar en Cn,w.Entrada: Los pesos {Wi}ni=1 y los valores {Vi}ni=1 de los
n objetos.Salida: El maximo valor que puede contener una mo-
chila de capacidad w.1: para i 0 hasta N hacer2: C0,w Ci,0 03: para i 1 hasta N hacer4: para j 1 hasta w hacer5: si Wi > w entonces6: Ci, j = Ci1, j.7: si no8: Ci, j = max(Ci1, j,Ci1, jWi + Vi).
12. Teora de grafosPara un grafo G con V(G) = {vi}pi=1, la sucesion
{grad vi}pi=1 ordenada en forma decreciente se denomi-na sucesion de grados de G. Una sucesion de enterosno negativos se dice grafica si es la sucesion de gradosde algun grafo.
Teorema 12.1 (Havel-Hakimi). Una sucesion {si}pi=1de enteros no negativos, con p 2 y di 1, es grafi-ca si, y solo si, la sucesion d2 1, d3 1, . . . , dd1+1 1, dd1+2, dd1+3, . . . , dp es grafica.
Algoritmo 12.1. Creacion de un conjun-to.
1: funcion HC(x)2: p(x) x, r(x) 0.
Algoritmo 12.2.
12
-
1: funcion H(x)2: mientras x , p(x) hacer3: x p(x).4: devolver p(x)
Algoritmo 12.3.1: funcion E(x, y)2: si r(x) > r(y) entonces3: x y.4: si r(x) = r(y) entonces5: r(y) r(y) + 1.6: p(x) y.7: devolver y.
Algoritmo 12.4. Une conjuntos considerando el pe-so.
1: funcion U(x, y)2: E(H(x),H(y)).
12.1. Circuitos eulerianosTeorema 12.2. Un grafo conexo contiene un circuitoeuleriano si, y solo si, a) cada vertice es de grado par;b) las aristas pueden particionarse en ciclos ajenos.
Algoritmo 12.5 (Hierholzer). Halla un circuito eule-riano pegando circuitos.Entrada: Un grafo conexo con todos sus vertices de
grado par.Salida: Un circuito euleriano C de G.
1: Sea v V . Construir un ciclo C empezando en v.2: mientras E(C) , E(G) hacer3: Sea w C, u V tal que {w, u} < E(C).4: Construir un ciclo C empezando en w en el gra-
fo G E(C).5: Insertar a C en lugar de w.
12.2. RecorridosAlgoritmo 12.6. Al hacer recorrido por profundidad,si el grafo no es conexo, marcar cada vertice visitadoapropiadamente.Entrada: Un grafo G = (V, E) con |V | = n.Salida: Una funcion de profundidad o anchura p y el
numero c de componentes del grafo.1: para todo 0 i n hacer2: p(i) .3: M {1, . . . , n}, c 0.4: mientras V(M) = falso hacer5: c c + 1, k mn(M), p(k) 0.6: M(vk,Q). {Si la busqueda es en profundidad,
Q es una pila. En otro caso, es una cola.}7: mientras Q , hacer
8: wS(Q).9: para todo {vi,w} E tal que p(i) = hacer
10: M(vi,Q), M M\{i}, p(i) p(w)+1.
Algoritmo 12.7. Halla vertices de separacion y puen-tes.Entrada: Un grafo G = (V, E).Salida: Un arreglo s tal que su = 1 u es de
separacion y p tal que puv = 1 uv es unpuente.
1: para todo u V hacer2: cu W, u , au 0, su 0.3: para todo uv E hacer4: puv 0.5: t 0.6: para todo u V hacer7: si cu = W entonces8: BPP(u).9: si au 1 entonces
10: su = 0
Algoritmo 12.8. Busqueda a primera profundidad parael algoritmo anterior.
1: funcion BBP(u)2: cu G, t t + 1, du Lu t.3: para todo uv E v , u hacer4: si cv = W entonces5: v v, au au + 1.6: BPP(v).7: Lu mn(Lu, Lv).8: si Lv > du entonces9: puv 1.
10: si Lv du entonces11: su 1.12: si no si dv < du entonces13: Lu mn(Lu, dv).14: cu B, t t + 1, fu t.15: fin funcion
12.3. Caminos mnimos
En esta seccion, G(E,V,W) es un grafo con el con-junto de aristas E y el conjunto de vertices V , con unafuncion de peso W : E R. La arista que conecta alos vertices u, v V se escribe como euv E.
12.3.1. Con una sola fuente
Se desea encontrar todas las distancias d(u) de cual-quier vertice a otro distinguido s.
13
-
Algoritmo 12.9 (Inicializacion). Establece el estadoinicial de conocimiento de distancias y rutas mas cor-tas.
1: funcion I(s)2: d(s) 0, (s) 0.3: para todo v V con v , s hacer4: d(v) , (v) N.
La arista euv se dice tensa si d(u) +W(euv) < d(v).
Algoritmo 12.10 (Relajacion). Si se encuentrauna arista tensa, se relaja con la siguiente fun-cion.
1: funcion R(euv)2: si d(v) > d(u) + w(euv) entonces3: d(v) d(u) + w(euv), (v) u.4: devolver verdadero.5: si no6: devolver falso.
Algoritmo 12.11 (Dijkstra). Aqu B una cola de prio-ridad de los vertices con prioridad d sobre el mni-mo. Siendo as, el tiempo de ejecucion del algoritmoes O(|E| + |V | log |V |).Entrada: Un vertice s V(G) como fuente.Salida: Una funcion de distancias mnimas d y de pre-
decesores .1: funcion D(G(E,V,W), d, , s)2: I(s)3: M(B, s).4: mientras B , hacer5: u =S(B).6: para todo euv E(G) hacer7: si R(euv) entonces8: M(B, v).
Algoritmo 12.12 (Moore-Bellman-Ford). Encuentralos caminos mnimos con una sola fuente en un grafopesado G(E,V,w) en tiempo O(|E||V |)
1: funcion BF(G(E,V,W), d, , s).2: I(s).3: para i 1 hasta |V | hacer4: para todo euv E(G) hacer5: R(euv);6: para todo euv E(G) hacer7: si d(v) > d(u) + w(euv) entonces8: devolver falso.9: devolver verdadero.
12.3.2. Entre todos los pares
Algoritmo 12.13 (Johnson). Este algoritmo corre entiempo O(|V ||E| + |V |2 log |V |).
Salida: Una funcion de distancias mnimas dv y de pre-decesores v para v V(G).
1: V = V {s}, E = E,W = W2: para todo v V hacer3: E = E {esv, evs}4: W(esv) 0,W(evs) .5: si BF(G(E,V ,W ), ds, s, s) es falso
entonces6: devolver Hay un ciclo negativo.7: para todo euv E hacer8: W (euv) ds(u) + w(euv) ds(v).9: para todo v V hacer
10: D(G(E,V,W ), dv, v, v).11: para todo u V hacer12: dv(u) ds(v) + dv(u) ds(u).
Algoritmo 12.14 (Floyd). Encuentra las distanciasmnimas entre todos los vertices de un grafo pesadoG = (V, E,w) en tiempo O(|V |3)Entrada: Matriz de pesos w de un grafo con n vertices.Salida: Matriz de distancias mnimas d y de caminos
p.1: para i 0 hasta n 1 hacer2: para j 0 hasta n 1 hacer3: di, j wi, j, pi, j i {Inicializacion}4: para i 0 hasta n 1 hacer5: di,i 0.6: para k 0 hasta n 1 hacer7: para i 0 hasta n 1 hacer8: para j 0 hasta n 1 hacer9: di, j mn(di, j, di,k + dk, j), pi, j pk, j.
12.4. Ordenamiento topologicoAlgoritmo 12.15. Algoritmo de ordenamiento to-pologico. Corre en tiempo O(|V |+|E|).Entrada: Un grafo dirigido acclico G = (V, E).Salida: Un ordenamiento lineal de V tal que y x si,
solo si, existe un camino dirigido de x hacia y.1: Meter todos los vertices cuya valencia de entrada
es cero en una cola Q.2: mientras Q , hacer3: Sacar a n de Q.4: devolver n.5: para todo vertice m con una arista enm hacer6: Quitar a e del grafo.7: si m no tiene otras aristas incidentes entonces8: Meter m a Q.
12.5. Mnimo arbol generadorAlgoritmo 12.16 (Kruskal). Encuentra en tiempoO(|E| log |V |) el mnimo arbol generador de un grafo co-
14
-
nexo pesado no trivial GSalida: El mnimo arbol generador F.
1: Ordenar E por peso y hacer F .2: para todo v V hacer3: HC(v).4: para i 1 hasta |E| hacer5: {u, v} ei.6: si H(u) , H(v) entonces7: U(u, v), F F {u, v}.
12.6. Grafos hamiltonianosAlgoritmo 12.17. Para determinar un ciclo hamiltonia-no de bajo peso en un grafo que satisface la desigualdaddel triangulo.Entrada: Un grafo completo pesado K de orden p
3.Salida: Un ciclo hamiltoniano de peso menor que el
doble del ciclo hamiltoniano mnimo.1: Encontrar el mnimo arbol generador T de G.2: Recorrer T en una busqueda a primero profundidad
obteniendo la secuencia de vertices vi1 , . . . , vip .3: devolver vi1 , . . . , vip , vi1 .
Teorema 12.3 (Dirac). Sea G un grafo de orden p 3.Si grad v p/2 para cada v V(G), entonces G eshamiltoniano.
12.7. Flujo maximoAlgoritmo 12.18 (Ford-Fulkerson). Este algoritmosolo funciona si las capacidades de las aristas son ra-cionales. Si Q es una cola, entonces el algoritmo correen tiempo O(|V ||E|(|V | + |E|)).Entrada: Una red G(E,V,C), una fuente s, un destino
t y un flujo factible f .Salida: Un flujo maximo f .
1: Etiquetar la fuente con (, , (s) = ).2: M(Q, s).3: mientras Q , hacer4: Tomar u = S(Q) con etiqueta (w,, (u)).5: para todo euv E(G) con v no etiquetado y tal
que f (euv) < c(euv) hacer6: Etiquetar a v con (u,+,mn((u), c(euv)
f (euv))).7: M(Q, v).8: para todo evu E(G) con v no etiquetado y tal
que f (euv) > 0 hacer9: Etiquetar a v con (u,,mn((u), f (euv))).
10: M(Q, v).11: si t esta etiquetado entonces12: (t).13: mientras t , s hacer
14: si la etiqueta de t es (u,+, (t)) entonces15: f (eu,t) f (eu,t) + 16: si no si la etiqueta de t es (u,, (t)) enton-
ces17: f (et,u) f (et,u) 18: t u.19: V(Q) y M(Q, s).
13. Localizacion de patrones
13.1. Algoritmo KMPAlgoritmo 13.1 (Knuth-Morris-Pratt). Localiza unacadena en otra.Entrada: Dos cadenas T y S , con |T | = n y |P| = m.Salida: Una posicion k tal que Tk Tk+n1 = P, o fal-
so si no existe.1: j 1.2: para i 1 hasta n hacer3: mientras j > 0 y Ti , P j hacer4: j = ( j).5: si j = m entonces6: devolver i m + 17: j j + 1.8: devolver falso.
Algoritmo 13.2. Calcula la funcion requerida en elalgoritmo anterior.Entrada: Una cadena P con |P| = mSalida: La funcion .
1: j 0.2: para i 1 hasta m hacer3: si Pi = P j entonces4: (i) ( j).5: si no6: (i) j.7: mientras j > 0 y Pi , P j hacer8: j ( j).9: j j + 1.
13.2. Deteccion de periodicidadesEl borde de una cadena C = c0 . . . cn1 es la subcade-
na propia de longitud maxima B = c0 . . . cb1 de C talque B = cnb . . . cn1.
Algoritmo 13.3. Calculo en tiempo O(n) de las longi-tudes de los bordes de los prefijos de la cadena C =c0 . . . cn1.Entrada: Una cadena C con |C| = nSalida: Un arreglo de las longitudes de los bordes B
tal que Bi es la longitud del borde de la subcadenac0 . . . ci.
15
-
1: B0 0.2: para i 0 hasta n 1 hacer3: b Bi.4: mientras b > 0 y Ci+1 , Cb hacer5: b Bb+1.6: si Ci+1 = Cb entonces7: Bi+1 b + 1.8: si no9: Bi+1 0.
Sea b la cardinalidad del borde B de C. EntoncesC consta de b npc cadenas iguales de longitud p, donden = |C| y p = n b, y p es el menor numero con esapropiedad. Si p\n, entonces la cadena es periodica conperiodo p.
14. Cuestiones miscelaneasdouble modf(double d, double *p) Devuelve la parte
fraccionaria de d, coloca la parte entera en *p.std::atoi(cadena.c str()) Convertir una cadena a un
numero.string.erase(posicion,nelementos) Borrar un subcon-
junto de la cadena.string.replace(posicion,nelementos,subcadena)
Reemplaza un subconjunto de una cadena.string::size type s1.find(s2) Devuelve la posicion de
la cadena s2 en s1. Si falla devuelve npos. Si nposesta ocupado, se lanza un range error.
string.substr(posicion,nelementos) Extraer un sub-conjunto de una cadena.
void erase(iterator pos) Elimina el elemento apunta-do por pos en un conjunto.
size type erase(const key type& x) Elimina el ele-mento x de un conjunto.
Aritmetica de precision arbitraria implementada concadenas.
string convertir(long long n) {
string c("");
do {
c += (char)(n%10+0); n /= 10;
}while(n);
reverse(c.begin(),c.end());
return c; }
string borrar_ceros(string a) {
int i=0;
while(a[i]==0&&i=10; }
/* ans += (u-(b[i]-0)+k+10)%10+0;
k = 0-((u-(b[i]-0)+k)=10; } }
/* ans += (u+k+10)%10+0;
k = 0-((u+k)0; j--){
for(i = n,k=0; i>0; i--){
t = ((a[i-1]-0)*(b[j-1]-0));
t += (ans[i+j-1]-0)+k;
ans[i+j-1] = (t%10)+0;
k = t/10;}
ans[j-1]=k+0; }
return borrar_ceros(ans); }
string divide_d(string a, int d) {
string temp("");
int N,i,res=0; N = a.size();
temp+=((a[0]-0)/d)+0;
res = ((int)(a[0]-0))%d;
for(i=1;i
-
mul.clear();
if(v.size()==1)
return divide_d(u,v[0]-0);
int m,q=0,a1,a2,a3,a4,a5,j,inc;
d += (10/((v[0]-0)+1)+0);
u = mult(d,u); v = mult(d,v);
u.insert(u.begin(),0); j = 0;
mul.push_back("0"); mul.push_back(v);
for(int k=2;k