notasacmicpc_tayundako

17
Notas para el ACM ICPC Octavio Alberto Agust´ ın Aquino Ricardo Omar Ch´ avez Garc´ ıa Fernando Said Ram´ ırez Garc´ ıa 17 de octubre de 2005 ´ Indice 1. Trigonometr´ ıa 1 2. Geometr´ ıa anal´ ıtica 2 2.1. Rectas, planos y c´ ırculos ........ 2 2.2. Transformaci´ on de coordenadas .... 2 2.3. Cuadr´ aticas ............... 2 3. Geometr´ ıa computacional 3 3.1. Triangulaci´ on de pol´ ıgonos ....... 3 3.2. Intersecci´ on de segmentos ....... 3 3.3. Envolvente convexa ........... 4 3.4. Punto en pol´ ıgono ............ 4 3.5. ınimo c´ ırculo encapsulador ...... 4 4. Teor´ ıa de n ´ umeros 4 4.1. Factoriales ................ 4 4.2. Ternas pitag´ oricas ............ 4 4.3. Algoritmo de Euclides ......... 4 4.3.1. Ciclos en sucesiones ...... 5 4.4. Divisores de un n´ umero ......... 5 4.5. umeros primos ............. 6 4.6. Potencias y logaritmos discretos .... 6 4.7. Teorema chino del residuo ....... 6 5. Combinatoria 6 5.1. Objetos combinatorios ......... 6 5.2. umeros combinatorios ......... 7 6. etodos n ´ umericos 8 6.1. Interpolaci´ on .............. 8 6.2. Diferenciaci´ on .............. 8 6.3. Integraci´ on ............... 8 6.4. Transformaci´ on r´ apida de Fourier ... 8 6.5. ´ Algebra lineal .............. 9 7. Probabilidad 9 8. Ordenamiento y b ´ usqueda 9 8.1. Algoritmos basados en comparaciones . 9 8.2. Algoritmos lineales ........... 10 8.3. usqueda binaria ............ 10 9. Programaci´ on din ´ amica 10 9.1. Suma de subconjunto .......... 10 9.2. Estructuras de Catalan ´ optimas ..... 10 9.3. Mayor subsecuencia com ´ un ....... 11 9.4. Distancia de edici ´ on ........... 11 9.5. Mayor subsecuencia creciente o decre- ciente .................. 11 9.6. Conteo de cambio ............ 12 10. Rastreo hacia atr´ as 12 11. Algoritmos voraces 12 12. Teor´ ıa de grafos 12 12.1. Circuitos eulerianos ........... 13 12.2. Recorridos ................ 13 12.3. Caminos m´ ınimos ............ 13 12.3.1. Con una sola fuente ....... 13 12.3.2. Entre todos los pares ...... 14 12.4. Ordenamiento topol´ ogico ........ 14 12.5. M´ ınimo ´ arbol generador ........ 14 12.6. Grafos hamiltonianos .......... 15 12.7. Flujo m´ aximo .............. 15 13. Localizaci ´ on de patrones 15 13.1. Algoritmo KMP ............. 15 13.2. Detecci´ on de periodicidades ...... 15 14. Cuestiones miscel ´ aneas 16 1. Trigonometr´ ıa Todo tri´ angulo tiene un c´ ırculo inscrito tangente a sus lados e interior a ´ el, cuyo centro es el punto de intersec- ci´ on de las bisectrices de los lados. Todo tri´ angulo tiene un c´ ırculo circunscrito que pasa por sus v´ ertices. El punto de intersecci ´ on de las media- nas del tri´ angulo es su centro de masa. Sea el tri´ angulo ABC con ´ angulos A, B y C y sean a, b y c los lados opuestos a dichos ´ angulos, respecti- vamente. Sean h c , t c y m c las longitudes de la altura, la bisectriz y la mediana que se originan en el v´ ertice C, y sean r y R los sendos radios de los c´ ırculos inscrito y 1

Upload: shassain

Post on 26-Sep-2015

7 views

Category:

Documents


2 download

DESCRIPTION

Ayuda para el acm, programacion de algoritmos

TRANSCRIPT

  • 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