Está en la página 1de 17

Notas para el ACM ICPC

Octavio Alberto Agustn Aquino

Ricardo Omar Chavez Garca

Fernando Said Ramrez Garca

17 de octubre de 2005

Indice

9. Programacion dinamica
9.1. Suma de subconjunto . . . . . . . . .
9.2. Estructuras de Catalan o ptimas . . . .
9.3. Mayor subsecuencia comun . . . . . .
9.4. Distancia de edicion . . . . . . . . . .
9.5. Mayor subsecuencia creciente o decreciente . . . . . . . . . . . . . . . . .
9.6. Conteo de cambio . . . . . . . . . . .

1. Trigonometra

2. Geometra analtica
2.1. Rectas, planos y crculos . . . . . . . .
2.2. Transformacion de coordenadas . . . .
2.3. Cuadraticas . . . . . . . . . . . . . . .

2
2
2
2

3. Geometra computacional
3.1. Triangulacion de polgonos .
3.2. Interseccion de segmentos .
3.3. Envolvente convexa . . . . .
3.4. Punto en polgono . . . . . .
3.5. Mnimo crculo encapsulador

3 10. Rastreo hacia atras


3
3 11. Algoritmos voraces
4
12. Teora de grafos
4
12.1. Circuitos eulerianos . . . . .
4
12.2. Recorridos . . . . . . . . . .
12.3. Caminos mnimos . . . . . .
4
12.3.1. Con una sola fuente .
4
12.3.2. Entre todos los pares
4
12.4. Ordenamiento topologico . .
4
12.5. Mnimo a rbol generador . .
5
12.6. Grafos hamiltonianos . . . .
5
12.7. Flujo maximo . . . . . . . .
6
6 13. Localizacion de patrones
6
13.1. Algoritmo KMP . . . . . . .
13.2. Deteccion de periodicidades
6
6 14. Cuestiones miscelaneas
7

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

4. Teora de numeros
4.1. Factoriales . . . . . . . . . . . .
4.2. Ternas pitagoricas . . . . . . . .
4.3. Algoritmo de Euclides . . . . .
4.3.1. Ciclos en sucesiones . .
4.4. Divisores de un numero . . . . .
4.5. Numeros primos . . . . . . . . .
4.6. Potencias y logaritmos discretos
4.7. Teorema chino del residuo . . .

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

5. Combinatoria
5.1. Objetos combinatorios . . . . . . . . .
5.2. Numeros combinatorios . . . . . . . . .

.
.
.
.

10
10
10
11
11

. 11
. 12
12
12

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

12
13
13
13
13
14
14
14
15
15

15
. . . . . . 15
. . . . . . 15
16

8 1. Trigonometra
8
Todo triangulo tiene un crculo inscrito tangente a sus
8
8 lados e interior a e l, cuyo centro es el punto de intersec8 cion de las bisectrices de los lados.
Todo triangulo tiene un crculo circunscrito que pasa
9
por sus vertices. El punto de interseccion de las media7. Probabilidad
9 nas del triangulo es su centro de masa.
Sea el triangulo 4ABC con a ngulos A, B y C y sean

8. Ordenamiento y busqueda
9 a, b y c los lados opuestos a dichos a ngulos, respecti8.1. Algoritmos basados en comparaciones . 9 vamente. Sean hc , tc y mc las longitudes de la altura, la
8.2. Algoritmos lineales . . . . . . . . . . . 10 bisectriz y la mediana que se originan en el vertice C,
8.3. Busqueda binaria . . . . . . . . . . . . 10 y sean r y R los sendos radios de los crculos inscrito y

6. Metodos numericos
6.1. Interpolacion . . . . . . . . . . .
6.2. Diferenciacion . . . . . . . . . . .
6.3. Integracion . . . . . . . . . . . .
6.4. Transformacion rapida de Fourier

6.5. Algebra
lineal . . . . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

circunscrito. Hagamos s = 12 (a + b + c). Se satisfacen


las siguientes relaciones.
c2 = a2 + b2 2ab cos C
a = b cos C + c cos B
a
= senb B = senc C
sen A
area = 21 chc = 12 ab sen C

(1)
(2)
(3)
(4)

c2 sen A sen B
2 sen C

(5)

= rs =

abc
4R

=
s(s a)(s b)(s c)
r = c sen 12 A sen 21 B sec 12 C
C
= ab sen
= (s c) tan 12 C
2s

1
= h1a + h1b + h1c

Cuadro 1: Ecuaciones de rectas


Condiciones
k B, pasa por A
Pasa por A yB
B, pasa por A

La distancia d de una recta Ax + By + C = 0 a un


1 +C|
punto dado (x1 , y1 ) es d = |Ax1 +By
.
A2 +B2
En general, el a rea de un polgono {pi }n1
i=0 es

n1
X


1
x
y
i
i

K({pi }n1
i=0 ) =
xi+1 yi+1
2

(6)
(7)
(8)
(9)

i=0

c
R = 2 sen
= 4abc
(10)
C
area
2 area
hc = a sen B = b sen A = c
(11)
q 

c2
2ab
cos 12 C = ab 1 (a+b)
tc = a+b
2 (12)
q
1 2
a + 21 b2 12 c2
(13)
mc =
2

cos(x y) = cos(x) cos(y) sen(x) sen(y)


sen(x y) = cos(x) sen(y) sen(x) cos(y)
2 tan x
tan 2x = 1tan
2
q x
x
sen 2x = 1cos
2
q
x
x
cos 2 = 1+cos
2
q
x
sen x
x
tan 2x = 1cos
= 1+cos
= 1cos
1+cos x
x
sen x

2.

Ecuacion
(r A) B = 0
(r A) (B A) = 0
(r A) B = 0

donde los ndices se toman modulo el numero de vertices 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 ).


x1 y1 x12 + y21 1
x y x2 + y2 1
2

D = 2 2 22
(21)
2
x
y
x
+
y
3
3

3
3 1
x4 y4 x2 + y2 1
4
4


2
2
x

x
y

y
1
4
1
4 (x1 x4 ) + (y1 y4 )

= x2 x4 y2 y4 (x2 x4 )2 + (y2 y4 )2 .


x3 x4 y3 y4 (x3 x4 )2 + (y3 y4 )2

(14)
(15)
(16)
(17)
(18)
(19)

2.2.

Geometra analtica

Transformacion de coordenadas

Si los ejes coordenados giran un a ngulo en torno


al origen en sentido horario, la relacion entre el sistema


original y el nuevo es
x1 y1 z1
!
!
!


Escribimos [p1 , p2 , p3 ] = x2 y2 z2 donde pi =

cos sen
x


=
.
(22)
x3 y3 z3

sen cos
y
(xi , yi , zi ). El a rea signada de un triangulo con vertices
en p1 = (x1 , y1 ), p2 = (x2 , y2 ) y p3 = (x3 , y3 ) es
2.3. Cuadraticas




1
[q
,
q
,
q
]
x

x
y

y
1 2 3
1
2
1
= 2
K({pi }3i=1 ) =
(20)
El polinomio de segundo grado
2
2 x3 x1 y3 y1
Q(x, y) = Ax2 + Bxy + Cy2 + Dx + Ey + F = 0,
donde q = (x , y , 1). La funcion K indica si el punto

2.1.

Rectas, planos y crculos

p3 se encuentra a la izquierda (K < 0), a la derecha en donde B , 0, puede transformarse en otro de la for(K > 0) o es colineal (K = 0) con respecto al segmento ma
dirigido
p1
p2 . Por lo tanto, la ecuacion de la recta Ax +
Q0 (, ) = A0 2 + C 0 2 + D0 + E 0 + F 0 = 0
By + C = 0 que pasa por los puntos (x1 , y1 ) y (x2 , y2 )
puede escribirse de la siguiente manera:
haciendo el cambio de variable (22) con parametro

x
y
1


B

si A , C,
x1 y1 1 = 0.
12 arctan AC
(23)

si A = C.
x2 y2 1
4
2

3.2.

La forma polar de una conica de excentricidad e, cuyo foco esta en el polo y a p unidades de la directriz,
es
ep
,
r=
1 + e cos( + )

Algoritmo 3.3. Determina si dos segmentos


p0
p1 y

q0 q1 se intersectan usando (20).


Entrada: Dos segmentos
p0
p1 y
q0
q1 .
Salida: Verdadero si los segmentos se intersectan. Falso 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) entonces
4:
devolver verdadero.
5: si no
6:
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 )) entonces
11:
devolver verdadero.
12:
si no si (d2 = 0) (p1 (s, S ) (t, T )) entonces
13:
devolver verdadero.
14:
si no si (d3 = 0) (q0 (u, U) (v, V)) entonces
15:
devolver verdadero.
16:
si no si (d4 = 0) (q1 (u, U) (v, V)) entonces
17:
devolver verdadero.
18: devolver falso.

donde es el a ngulo que forman el eje polar y la lnea


que une el foco y el polo, tomado en sentido horario. Si
e = 1, tenemos una parabola; si e < 1, una elipse, y si
e > 1, una hiperbola.

3.

Geometra computacional

Teorema 3.1 (Pick). Sea P un polgono reticular, I(P)


el numero de puntos reticulares interiores a e l y F(P)
los puntos reticulares en su frontera. Entonces
K(P) = I(P) +

3.1.

Interseccion de segmentos

F(P)
1.
2

Triangulacion de polgonos

Una oreja de un polgono P son tres vertices consecutivos que determinan un triangulo completamente
contenido en P. Todo polgono tiene al menos una oreja.
Algoritmo 3.1. Determina si tres puntos de un polgono son una oreja.
Entrada: Tres puntos pi ,p j ,pk en un polgono P ordenado 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 entonces
3:
devolver falso.
4: para todo m , i, j, k hacer
5:
si pm 4pi p j pk entonces
6:
devolver falso.
7: devolver verdadero.

Sean s1 y s2 dos segmentos. Decimos que son comparables si la lnea de barrido los intersecta, y que s1
esta por arriba de s2 si su ordenada de interseccion es la
mayor de ambas.

Algoritmo 3.4. Determina si un conjunto de segmentos


se 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 derecha, de extremo izquierdo a derecho y de menor a
mayor ordenada.
Algoritmo 3.2 (Otectoma). Triangula un polgono P 3: para todo p P hacer
de n vertices en tiempo O(n2 ).
4:
si p es extremo izquierdo de un segmento s enEntrada: Un polgono P = {pi }n1
tonces
i=0
Salida: Una triangulacion T .
5:
I(T, s).
1: T .
6:
si A(T, s) s , o A(T, s) s ,
2: para todo pi P hacer
entonces
3:
li (i 1) mod n, ri (i + 1) mod n.
7:
devolver verdadero.
4: i n 1.
8:
si p es extremo derecho de un segmento s enton5: mientras |T | < n 2 hacer
ces
6:
i ri
9:
si A(T, s)A(T, s) , entonces
7:
si O(li , i, ri , P) entonces
10:
devolver verdadero.
8:
T T {pli , pi , pri }.
11:
S(T, s).
9:
lri li , rli ri .
12: devolver falso.
3

3.3.

Envolvente convexa

10:
g g 1.
11: devolver g.

Algoritmo 3.5 (Graham). Calcula la envolvente convexa de un conjunto de puntos Q.


Entrada: Un conjunto de puntos Q = {pi }mi=0 R2 .
Salida: El conjunto de vertices de la envolvente convexa en la pila S .
1: Sea p0 Q el punto de menores coordenadas.
2: Sean p1 . . . pm los puntos restantes de Q ordenados por a ngulo polar alrededor de p0 . Si hay
empates, quitar todos los de mismo a ngulo salvo el
de mayor modulo.
3: Meter p0 , p1 , p2 en la pila S .
4: para i 3 hasta m hacer
5:
mientras K(ptope(S )1 , ptope(S ) , pi ) 0 hacer
6:
S(S ).
7:
M(S , pi ).

3.5.

Mnimo crculo encapsulador

Algoritmo 3.8. Para hallar el centro y el radio


del mnimo crculo encapsulador, invocamos a MC(P, ).
Entrada: Un conjunto de puntos P = {pi }ni=1 .
Salida: El centro c y radio r del mnimo crculo encapsulador.
1: funcion MC(P, B)
2: si |B| = 1 entonces
3:
devolver c b1 y r 0.
4: si no si |B| = 2 entonces
5:
devolver c 21 (b1 + b2 ) y r 12 d(b1 , b2 ).
6: si no si |B| = 3 entonces
7:
Hacer c el centro del crculo circunscrito del
triangulo {b1 , b2 , b3 }
3.4. Punto en polgono
8:
devolver c y r d(c, b1 ).
Las operaciones en los ndices del polgono son 9: c (, ), r 0.
modulo el numero de vertices del mismo.
10: para todo pi P hacer
11:
si d(pi , c) > r entonces
Algoritmo 3.6. Determina si un punto esta en el inte- 12:
B B {pi }.
rior de un polgono simple. Identificamos al punto (x, y) 13:
MC(P, B).
con (x, y, 1) y con (1, 0, 0).
14: fin funcion
Entrada: Un punto p = (x0 , y0 , 1) y un polgono P.
Salida: Verdadero si el punto esta en el polgono. Falso
en caso contrario.

4. Teora de numeros
1: a falso.

2: para todo pi pi+1 P hacer


4.1. Factoriales
3:
si ([p, , pi ] < 0) , ([p, , pi+1 ] < 0) entonces
La mayor potencia
de un primo p que divide a n! es
4:
si ([pi , pi+1 , p] < 0) , ([pi , pi+1 , ] < 0) enPblog p nc j n k
. En consecuencia, el numero Z de
 p (n) = k=1
tonces
pk
Pblog nc j k
5:
a a.
ceros al final de n! es Z = k=1 5 5nk .
6:
si no si [pi , pi+1 , p] = 0 xi x xi+1 entonces
Teorema 4.1 (Wilson). Se satisface (p 1)! 1
7:
devolver verdadero.
(mod p) si, y solo si, p es primo.
8: devolver a.
Algoritmo 3.7. Determina si un punto esta en el interior 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 hacer


3:
si yi y0 entonces
4:
si yi+1 > y0 entonces
5:
si K(pi , pi+1 , p0 ) < 0 entonces
6:
g g + 1.
7:
si no
8:
si yi+1 y0 entonces
9:
si K(pi , pi+1 , p0 ) > 0 entonces

4.2.

Ternas pitagoricas

Las ternas pitagoricas son tripletes (u, v, w) N3 tales que w2 = u2 + v2 . Si u v w, entonces la tripleta
se 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 forma, no todas son primitivas.

4.3.

Algoritmo de Euclides

Algoritmo 4.1 (Euclides). Calcula el maximo comun


divisor 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 hacer
2:
si |a| > |b| entonces
3:
a a mod b.
4:
si no
5:
b b mod a.
6: si a , 0 entonces
7:
devolver a.
8: si no
9:
devolver b.

Salida: La longitud t del ciclo de a.


1: a1 , a1 , t 0.
2: repetir
3:
f (), f ( f ()), t t + 1.
4: hasta que =

4.4.

Divisores de un numero

Teorema 4.2. Sea n N y sea


n=

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 entonces
4:
devolver (d, u, 0).
5: si no
6:
v1 0, v3 b.
7: mientras v3 , 0 hacer
8:
q bd/v3 c, t3 d mod v3 .
9:
t1 u qv1 , u v1 , d v3 , v1 t1 , v3 t3 .
10: devolver (d, u, (d au)/b).

s
Y

pi i

(24)

i=1

su descomposicion en numeros primos. Entonces n tieQs


(i + 1) divisores.
ne N = i=1
El menor divisor propio p de un numero n es primo.

Algoritmo 4.5 (Division exhaustiva). El siguiente algoritmo halla el menor divisor de un numero entero.
Entrada: n N.
Salida: El menor divisor d de n, o 1 si n = 1.
1: si n 0 (mod 2) entonces
2:
devolver 2.
3: si n 0 (mod 3) entonces
4:
devolver 3.
5: 0 2, 1 4, d 5, i 0, q 25.
6: mientras n mod d > 0 q n hacer
q q + 2i d + 4 + 12i, d d + i , i (i + 1)
Con el algoritmo anterior puede resolverse una con- 7:
mod 2.
gruencia de la forma ax b mod m.
8: si q > n entonces
Algoritmo 4.3. Calcula una solucion de ax = b 9:
devolver n.
mod m.
10: devolver d.
Entrada: a, b, m Z.
Salida: Si existe, x tal que ax = b mod m. Si no, fal- Algoritmo 4.6 (Suma de divisores). Para obtener la
suma de los divisores propios de un numero, aproveso.
chamos la identidad
1: (d, x0 , y0 ) MCD(a, m).
X
X 
n
2
2: si d\b entonces
d + [d < n] .
(n) =
d=
d
3:
x x0 (b/d)
d\n
d\n
2 n
1<d<n
1<d
4:
para i = 0 hasta d 1 hacer
5:
devolver (x + i md ) mod m
Entrada: n N.
6: si no
Salida: S = (n).
7:
devolver falso.
1: S 0, d 1, c 1.
Observese que podemos resolver la ecuacion 2: repetir
diofantica ax + my = b, obteniendo x con el algoritmo 3:
si n 0 mod d entonces
anterior y y = bax
,
siempre
que
(a,
m)\b.
4:
S S + d.
d
5:
si c < n entonces
6:
S S + dn
4.3.1. Ciclos en sucesiones
7:
c c + d + d + 1, d d + 1.
Algoritmo 4.4 (Floyd). Encuentra un ciclo en una su- 8: hasta que c > n
cesion definida a traves de ai+1 = f (ai ), donde f : S
Para la suma de todos los divisores de n, se puede
S y S es finito.
Q s pi i +1 1
Entrada: Una sucesion finita {ai }
.
usar

(n)
=
1
i=1 pi 1 .
i=1
5

4.5.

Numeros
primos

Algoritmo 4.8 (Exponenciacion rapida). Calcula ab


en 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 hacer
3:
si b 1 mod 2 entonces
4:
r a r. j k
5:
a a a, b 2b .
6: devolver r.

Los numeros M p = 2 p 1, con p primo, se denominan primos de Mersenne.


Teorema 4.3 (Lucas-Lehmer). Sea rn la sucesion definida a traves de r1 = 4, rn+1 = rn2 2. Entonces M p es
primo si, y solo si, M p /r p1 .
Teorema 4.4 (Euclides). Si M p es primo, entonces
2 p1 (2 p 1) es perfecto, y recprocamente.
Teorema 4.5. El numero de Fermat Fn = 22 + 1 es
Fn 1
primo si, y solo si, 3 2 1 (mod Fn ).
n

4.7.

Teorema chino del residuo

Del Teorema 4.7 se sigue que si p es un primo impar


Teorema 4.10. Sean a1 , . . . , an , m1 , . . . , mn Z tales
y (a, p) = 1 entonces
que los elementos de {mi }ni=1 son coprimos. Entonces el
a p1 1 (mod p).
(25) sistema x ak (mod mk ), k = 1, . . . , n, tiene solucion.
Todo numero que satisface (25) se dice un pseudoprimo para la base a. Los primos impares son pseu- Algoritmo 4.9 (Chino inductivo). Calcula una soludoprimos para todas sus bases coprimas. Los numeros cion al sistema del Teorema 4.10.
compuestos que son pseudoprimos para todas sus bases Entrada: Dos conjunto de enteros: {mi }ni=1 coprimos a
coprimas se denominan numeros de Carmichael.
pares y {xi }ni=1 .
Salida: x tal que x xi (mod mi ).
Teorema 4.6. El entero n > 1 con descomposicion (24)
1: m m1 , x x1 .
es un numero de Carmichael si, y solo si, i = 1 y (pi
2: para i 2 hasta k hacer
1)/(n 1) para todo i = 1, . . . , s.
3:
(d, u, v) MCD(m, mi ).
x umxi + vmi x, m mmi , x x mod m
Algoritmo 4.7 (Eratostenes). Obtencion de los pri- 4:
5:
devolver
x.
mos hasta una cota dada por medio de una criba.
Entrada: Una cota N para obtener todos los primos
5. Combinatoria
impares hasta 2N + 1.
Salida: Un arreglo X tal que Xk = [2k+1 no es primo].
Teorema 5.1 (Principio de inclusion y exclusion).
1: X (0, . . . , 0).

Sea {Ai }ni=1 una coleccion de conjuntos. Sea P+ (n) el


2: para k 3 hasta 2N + 1 sumando 2 hacer
conjunto
subconjuntos
no vacos I de {1, . . . , n}. En Sde
P
3:
si X(k1)/2 = 0 entonces
n
|I|+1 T


2
tonces
(1)
A
=
| iI Ai |.
IP+ (n)
i=1 i
4:
para i k hasta 2N + 1 sumando 2k hacer
5:
X(i1)/2 1.


Teorema 5.2. Hay n+k1
formas de colocar n objetos
k1
distinguibles en k cajas distinguibles.

4.6.

Potencias y logaritmos discretos

Sea G un grupo que actua por la izquierda sobre


un conjunto S . Para g S consideramos el conjunto
F(g) = {s S : gs = s}. La o rbita de s S es el
conjunto orb(s) = {gs : g G}.

Teorema 4.7 (Euler). Para todo n > 1, a Zn , a(n)


1 (mod n), donde (n) es la cardinalidad del conjunto
de numeros que son coprimos con n.
Q s i 1
La funci
o
n

satisface
(n)
=
(pi 1) =
i=1 pi

Q 
1
n p/n 1 p .

Teorema 5.3 (Burnside). Sea G un grupo finito que


actua sobre el conjunto S . El numero de o rbitas de G
Teorema 4.8. El grupo multiplicativo Zn es cclico si, y en S es 1 PgG |F(g)|.
|G|
solo si, n = 2,4,pe o 2pe para un primo impar p y algun
e Z positivo.

5.1.

Teorema 4.9. Si Zn esta generado por g, entonces g x


gy mod n si, y solo si, x y (mod (n))

Objetos combinatorios

Aqu T es un segmento inicial de N de longitud n.


6

Algoritmo 5.1 (sucesor, codigo Gray). Aqu se consi- 2: para i n 1 hasta k hacer
si ti1 + 1 ti 1 entonces
dera el orden de cambio mnimo para los subconjuntos 3:
de T .
4:
b 1 b.
5:
para j ti1 + 1 hasta ti 1 hacer
1: si |T | 0 mod 2 entonces
j
6:
r r + n
2:
U T {n}.
ki
7: devolver r.
3: si no
4:
j n.
Algoritmo 5.6 (extractor, k-subconjuntos). Extrae
5:
mientras j < T y j > 0 hacer
de la posicion r el k-subconjunto (combinacion) de
6:
j j 1.
T.
7:
si j = 1 entonces
1: x 1
8:
devolver falso.
2: para i 1 hasta
nx k hacer
9:
U T { j 1}.
r hacer
3:
mientras
10: T = U.

ki
11: devolver verdadero.
, x x + 1.
4:
r r nx
ki
5:
ti x, x x + 1.
Algoritmo 5.2 (colocador, codigo Gray). Se conside6: devolver T .
ra el orden de cambio mnimo para los subconjuntos de
T.
Algoritmo 5.7 (extractor, permutaciones). Extrae de
1: b r 0.
la posicion r una permutacion de T en orden lexico2: para i n 1 decreciendo hasta 0 hacer
grafico.
3:
si n i T entonces
1: n 1.
4:
b 1 b.
2: para j 1 hasta n 1 hacer
5:
si b = 1 entonces
3:
d b r modj!( j1)! c, r r d j!, n j d + 1
i
6:
r r+2.
4:
para i n j + 1 hasta n hacer
7: devolver r.
5:
si i > d entonces
i i + 1.
Algoritmo 5.3 (extractor, codigo Gray). Se considera 6:
el orden de cambio mnimo para los subconjuntos de 7: devolver .
T.

Algoritmo 5.8 (colocador, permutaciones). Coloca


en la posicion r una permutacion de T en orden lexicografico.
1: r 0, .
2: para j 1 hasta n hacer
3:
r r + ( j 1)(n j)!
4:
para i j + 1 hasta n hacer
5:
si i > j entonces
6:
i i 1.
Algoritmo 5.4 (sucesor, k-subconjuntos). Calcula el
sucesor de un k-subconjunto (combinacion) de T en or- 7: devolver r.
den lexicografico.
1: U T, i k

5.2. Numeros
combinatorios
2: mientras ((i 1) (ti = n k + 1)) hacer
1. Subconjuntos
3:
i i 1.
n de k elementos de un conjunto de n
elementos:
.
4: si i = 0 entonces
k

5:
devolver falso.
n!
.
Formula explcita: nk = k! (nk)!
n+1  n  n
6: si no
Recurrencia: k = k1 + k .
7:
para j i hasta k hacer
 
8:
u j ti + 1 + j i.
Valores iniciales: n0 = nn = 1, n 0.
9:
devolver verdadero.
2. Permutaciones
de n letras que tienen exactamente
hni
k
ciclos:
.
Algoritmo 5.5 (colocador, k-subconjuntos). Coloca
k
hi h i
hn1i
un k-subconjunto (combinacion) de T en la posicion
Recurrencia: nk = n1
+
(n

1)
r.
h0ik1
hni k
Valores iniciales: k = [k = 0], 0 = [n = 0].
1: t0 r 0.
1: T , b0 0.
2: para i
j nk 1 decreciendo hasta 0 hacer
3:
b 2ri
4:
si b , b0 entonces
5:
T T {n i}.
6:
b0 b, r r b2i .
7: devolver T .

Rb
3. Permutaciones DdeE n letras que tienen exactamente Salida: El valor de a f (x) dx con la tolerancia estak ascendentes: nk .
blecida.
Dn1E
Dn1E
DnE
1: funcion S( f, [a, b], )
Recurrencia: k = (k + 1) k + (n k) k1
, c = b+a
.
2: h ba
D0E
2
2
Valores iniciales: k = [k = 0].
3: a1 a, b1 a2 c, b2 b.
b1 +a1
b2 +a2
4. Particiones
de un conjunto de n elementos en k cla- 4: c1 = 2 , c2 = 2 .
nno
S (a1 ,b1 ,c1 ,h)+S (a2 ,b2 ,c2 ,h)
5: L =
.
ses: k .
2
1
nno nn1o
nn1o
6: si 10
|L S (a, b)| <  entonces
Recurrencia: k = k1 + k k .
7:
devolver L.
no
no
Valores iniciales: 0k = [k = 0], n0 = [n = 0].
8: si no
9:
devolver S( f, [a1 , b1 ], 2 )+S( f, [a2 , b2 ], 2 ).
5. Particiones p(n, k) de n cuya mayor parte es k.
Recurrencia: p(n, k) = p(n1, k1)+ p(nk, k).
Sea f : R R. Supongamos que J 1 y que los
Valores iniciales: p(n, k) = 0 si n 0, k 0 o puntos {xk = a + kh} subdividen al intervalo [a, b] en
k > n y p(1, 1) = 1.
2 J = 2M intervalos de anchura h = ba
. Haciendo
2J
h
T (0) = 2 ( f (a) + f (b)), la formula trapezoidal recurren6. Numeros de Catalan Cn .
2n
te es
1
M
Formula explcita: Cn = n+1
.
X
n
T (J 1)
Pn
2(2n+1)
T
(J)
=
f (x2k1 ).
+
h
Recurrencias: Cn+1 = n+2 Cn = k=0 CkCnk .
2
k=1

6.
6.1.

Iniciando la tabla R J,0 = T (J), tenemos la recursion de


Richardson

Metodos numericos

R J,K =

Interpolacion

4K R J,K1 R J1,K1
,
4K 1

Dados los puntos {(xi , yi )}ni=0 , la recurrencia de NeviRb


que aproxima a a f (x) dx con un error de truncamiento
lle
de orden O(h2K+2 ) para R(J, K) cuando f C 2K+2 [a, b].
(x xi j )Qi, j1 (x) (x xi )Qi1, j1 (x)
Qi, j (x) =
xi x j1

6.4.

Transformacion rapida de Fourier

calcula el valor de la interpolacion polinomial de dichos


Algoritmo 6.2. Transformacion rapida de Foupuntos, usando como valores iniciales Qi,0 = yi .
rier.
1: funcion TRF(a)
6.2. Diferenciacion
2: n |a| {n es una potencia de 2}
0
La formula central de f para una funcion f 3: si n = 1 entonces
3
4:
devolver a.
C [a, b] con x h, x, x + h [a, b] es
5: para j 1 hasta n/2 hacer
f (x + h) f (x h)
0
6:
b j a2 j1 , c j a2 j
=: fc (x, h),
f (x)

2h
7: b TRF(b),
 
  c TRF(c).
2
2
2
0
,

exp
.
8:

exp
n
n
con error O(h ). La formula central de f para una funn
n
5
9:

1.
cion f C [a, b] con x2h, xh, x, x+h, x+2h [a, b]
10: para j 1 hasta n/2 hacer
es
0
11:
aj bj + cj , aj+n/2+1 bj cj .
f (x) 8 fc (x, h) 2 fc (x, 2h),
12:
n {Usar n para la inversa}
con error O(h4 ).
Algoritmo 6.3. Multiplicacion de polinomios con
TRF.
6.3. Integracion
m1
Entrada: Dos sucesiones a = {ak }n1
k=0 y b = {bk }k=0
Algoritmo 6.1 (Metodo de Simpson adaptativo).
que son los coeficientes de los polinomios p(x) =
Pn1
Pm1
k
k
En el siguiente algoritmo, definimos S (a, b, c, h) =
k=0 ak x y q(x) =
k=0 bk x .
h
( f (a) + 4 f (c) + f (b)).
Salida: Una sucesion c = {ck }n1
3
k=0 de los coeficientes
Entrada: Un intervalo de integracion [a, b], una fundel polinomio p(x) q(x).
cion f C 4 [a, b] y una tolerancia .
1: funcion MP(a, b)
8

2:
3:
4:
5:
6:
7:
8:
9:
10:

` dlog2 (n + m)e
para j n hasta 2` 1 hacer
a j 0.
para j m hasta 2` 1 hacer
b j 0.
=TRF(a), =TRF(b)
para k = 0 hasta k = n 1 hacer
k k k .
devolver c ITRF().

6.5.

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, con
distribuciones f y g respectivamente,
R entonces la distribucion de Z = X + Y es f g = f (t)g(x t) dt.

8.

Algebra
lineal

8.1.

Ordenamiento y busqueda
Algoritmos basados en comparaciones

Algoritmo 6.4. Encuentra la descomposicion LUP de


una matriz A Mmn .
En los algoritmos de esta seccion N es la cardinali1: para i = 1 hasta n hacer
dad del conjunto L a ordenar.
2:
[i] i
3: para k 1 hasta n hacer
Algoritmo 8.1 (Ordenamiento por insercion). Puede
4:
p0
calcular el numero mnimo de intercambios para orde5:
para i k hasta n hacer
nar a L. En cada iteracion del ciclo externo los elemen6:
si |aik | > p entonces
tos L0 , . . . Li forman una lista ordenada.
7:
p |aik |, k0 i.
1: 0.
8:
si p = 0 entonces
2: para i 1 hasta i < N hacer
9:
error Matriz singular.
3:
t Li , j i 1.
10:
Intercambiar [k] [k0 ].
4:
mientras L j > t y j 0 hacer
11:
para i 1 hasta n hacer
5:
L j+1 L j , j j 1.
12:
Intercambiar ak1 ak0 i .
6:
L j+1 t, + 1.
13:
para i k + 1 hasta n hacer
7: devolver .
14:
aik aik /akk .
Algoritmo 8.2 (Ordenamiento por fusion). Puede
15:
para j k + 1 hasta n hacer
calcular el numero mnimo de intercambios para orde16:
ai j ai j aik ak j .
nar a L en tiempo O(n log n).
Algoritmo 6.5. Resuelve el sistema Ax = b con la des- 1: 0.
composicion LUP de A Mmn .
2: funcion P(i, j).
1: para i = 1 hasta n hacer
3: si i , j entonces
P
2:
yi b[i] i1
j=1 Li j y j .
4:
p b i+2 j c.
3: para i = nPhasta 1 hacer
5:
P(i, p), P(p + 1, j).
yi nj=i+1 Ui j x j
.
4:
xi
6:
a
0, b 0, c 0.
Ui j
7:
mientras (a < (p + i 1)) (b < ( j p)) hacer
8:
si Li+a < L p+1+b entonces
7. Probabilidad
9:
c Li+a , a a + 1.
10:
si no
Teorema 7.1 (Desigualdad de Markov). Sea t > 0 y 11:
c L p+i+b , b b + 1.
X una variable aleatoria no negativa. Entonces P(X 12:
+ p + 1 (a + i). {Intercambio.}
.
t) E(X)
t
13:
c c + 1.
14:
mientras
i + a p hacer
Teorema 7.2 (Desigualdad de Chebyshev). Sea t > 0
c Li+a , a a + 1, c b + 1.
y X una variable aleatoria no negativa. Entonces P(|X 15:
V(X)
16:
mientras
p + 1 + b j hacer
E(X)| t) t2 .
17:
c L p+1+b , b b + 1, c b + 1.
Sean dos eventos A y B, con sendas probabilidades 18: para todo k, 0 k j i hacer
19:
Li+k = i .
P(A) y P(B).
1. La probabilidad condicional P(A|B) satisface Algoritmo 8.3. Algoritmo de ordenacion rapida de
P(A|B) = P(AB)
.
Hoare. Se invoca con OR(0, N1).
P(B)
9

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:

funcion OR(i, j)
d Lj
i 1, j, c 1
si i j entonces
devolver .
mientras c > 0 hacer
mientras L < d hacer
+ 1.
mientras L > d hacer
1.
si < entonces
Intercambiar L L
si no
c 0.
Intercambiar L L
OR(i, 1), OR( + 1, j).

8.2.

Algoritmos lineales

5:
si no
6:
j p.
7: si Li = K entonces
8:
devolver i.
9: si no si L j = K entonces
10:
devolver j.
11: si no
12:
devolver falso.

9.
9.1.

Programacion dinamica
Suma de subconjunto

Algoritmo 9.1. Dado un conjunto de enteros positivos


{a1 , . . . , an }, queremos saber cuantos subconjuntos de
tal 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 ],

Algoritmo 8.4 (Conteo).


Entrada: Un arreglo A a ordenar, y una cota para los para 2 i n y 1 j B. El valor de m(n, B) nos da la
datos k.
respuesta, calculando m tiempo O(nB).
1: para i 1 hasta k hacer
1: para j 1 hasta B hacer
2:
C[i] 0.
2:
m(1, j) [ j = a1 ].
3: para j 1 hasta longitud(A) hacer
3: para i 2 hasta n hacer
4:
C[A[ j]] C[A[ j]] + 1.
4:
para j 1 hasta B hacer
5: para i 2 hasta k hacer
5:
m(i, j) m(i 1, j) + [ j = ai ].
6:
C[i] C[i] + C[i 1]
6:
si j > ai entonces
7: para j = |A| decreciendo hasta 1 hacer
7:
m(i, j) m(i, j) + m(i 1, j ai )
8:
B[C[A[ j]]] A[ j]
9:
C[A[ j]] C[A[ j]] 1
Algoritmo 9.2 (Recuperacion de un subconjunto).
La tabla generada anteriormente da informacion sufiAlgoritmo 8.5 (Cubeta). Ordena {Ai }ni=1 [0, 1) usan- ciente para encontrar un subconjunto en tiempo O(B),
do n subintervalos iguales de [0, 1).
llamando a S(n, B).
1: para i 1 hasta n hacer
1: funcion S(i, B)
2:
Insertar A[i] en la lista B[bnA[i]c].
2: si m(i, B) = 0 entonces
3: para i 0 hasta n 1 hacer
3:
imprime No hay solucion.
4:
Ordenar la lista B[i] con insercion.
4: si no si B = ai entonces
5: Concatenar las listas B[0], . . . , B[n 1] en orden.
5:
imprime ai .
6: si no si B > ai entonces
7:
imprime ai .

8.3. Busqueda
binaria
8:
S(i 1, B ai ).

Algoritmo 8.6 (busqueda


binaria). Algoritmo que
busca una llave en un conjunto ordenado en tiempo
9.2. Estructuras de Catalan o ptimas
O(log2 n).
Entrada: La llave K para buscar, el lmite inferior i y Algoritmo 9.3 (Mnimo generico). Se le ajussuperior j donde se hara la busqueda.
ta la relajacion apropiada al siguiente algoritSalida: k tal que Lk = K o falso si no existe.
mo.
1: mientras j i > 1 hacer
1: funcion M
c.
2:
p = b j+i
2: para i 1 hasta n 1 hacer
2
3:
si L p < K entonces
3:
Mi,i+1 0.
4:
i p.
4: para j 2 hasta n 1 hacer
10

7:
si Xi1 = Y j1 entonces
8:
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 no
12:
ci, j ci, j1 , bi, j 3.
13: devolver cm,n

5:
para i 1 hasta n d hacer
6:
R(i, j).
7: devolver M1,n

Algoritmo 9.4 (Relajacion). Si el problema es de


triangulacion o ptima usamos:

(Area),
12 |K(pi , p j , pk )|
F(i, j, k) =

kpi , p j k + kp j , pk k + kpk , pi k (Permetro). Algoritmo 9.7 (Recuperacion de la subsecuencia).


Requiere que se haya ejecutado previamente el algodonde k, k es una metrica adecuada. Si es de multipli- ritmo anterior.
cacion o ptima de n matrices, usamos
1: funcion S(i, j, X, b)
2: si i = 0 j = 0 entonces
F(i, j, k) = D(i) D( j) D(k)
3:
devolver .
4:
si
b
i, j = 1 entonces
donde la matriz i-esima es de dimension D(i) D(i + 1)
S(i 1, j 1, X, b)
y 1 i n. Para el problema de secuencia o ptima de 5:
6:
imprime Xi1 .
corte, tenemos
7: si no si bi, j = 2 entonces
8:
S(i 1, j, X, b)
F(i, j, k) = C( j) C(i),
9: si no
donde C(i) es el corte i-esimo.
10:
S(i, j 1, X, b)
1: funcion R(i, j)
2: Mi, j .
9.4. Distancia de edicion
3: para k i + 1 hasta j 1 hacer
Sean m la matriz de costos mnimos de transforma4:
t F(i, j, k) + Mi,k + Mk, j .
cion
y p la matriz de predecesores. Considerando que la
5:
si Mi, j > t entonces
operacion 1 es cambiar, la 2 es insertar y la 3 es borrar,
6:
Mi, j t, si, j k
tenemos las siguientes condiciones iniciales
Algoritmo 9.5 (Recuperacion de la secuencia). Para
recuperar la secuencia de pasos para obtener el mnimo,
d0,0 = 0, d0, j = j, di,0 = i,
invocamos a S(s, 1, n).
p0,0 = 1, p0, j = 1, pi,0 = 2,
1: funcion S(s, i, j)
para 0 i |s1 | y 0 j |s2 |. Definamos
2: si i = j entonces
3:
imprime A+i.
T 1 (i, j) = di1, j1 + [si , s j ],
(Cambiar)
4: si no
T 2 (i, j) = di, j1 + 1,
(Insertar)
5:
imprime (.
6:
S(s, i, si, j ).
T 3 (i, j) = di1, j + 1.
(Borrar)
7:
S(s, si, j + 1, j).
Las relaciones de recurrencia son:
8:
imprime ).

9.3.

di, j = mn{T k (i, j) : 1 k 3},

Mayor subsecuencia comun

Algoritmo 9.6 (Longitud de la mayor subsecuencia

comun).
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 hacer
2:
ci,0 0.
3: para j 1 hasta n hacer
4:
c0, j 0.
5: para i 1 hasta m hacer
6:
para j 1 hasta n hacer

pi, j = k.

Tenemos que d|s1 |,|s2 | es la distancia de edicion.

9.5.

Mayor subsecuencia creciente o decreciente

Algoritmo 9.8. Dada la sucesion {Ai }ni=1 , encuentra una


subsucesion {Aik }mk=1 que sea estrictamente creciente o
decreciente 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 hacer


2:
para j i + 1 hasta n hacer
3:
si A j > Ai y `i + 1 > ` j entonces
4:
` j `i + 1, j i.

11.

Algoritmos voraces

Algoritmo 11.1 (Mochila continua).


Entrada: Un conjunto {(si , wi )}ni=1 de pares ordenados
de reales positivos y un objetivo S .
P
Salida: Un conjunto {xi }ni=1 tal que S = ni=1 xi si y
Pn
9.6. Conteo de cambio
i=1 xi wi es mnimo.
1: Ordenar {(si , wi )}ni=1 segun wi /si en forma no decreAlgoritmo 9.9.
ciente.
Entrada: Un conjunto M = {mi }ni=0 N y W N.
Salida: El numero de submulticonjuntos de M que su- 2: s S , i 1.
3: mientras si s hacer
man W.
4:
xi 1, s = s si , i i + 1.
1: F0 1
5: xi s/si .
2: para i 0 hasta n 1 hacer
6: para j i + 1 hasta n hacer
3:
c Mi
7:
x j 0.
4:
para j c hasta W hacer
5:
F j F j + F jc
Algoritmo 11.2 (Mochila 0-1). Si tenemos n objetos
6: devolver FW .
con pesos Wi y valores Vi con 1 i n y una mochila
con capacidad w. Que objetos debemos meter en la
mochila para maximizar el valor de lo que contiene? La
10. Rastreo hacia atras
solucion se puede encontrar en Cn,w .
Entrada: Los pesos {Wi }ni=1 y los valores {Vi }ni=1 de los
Solucion de un problema por rastreo hacia atras.
n objetos.
Algoritmo 10.1. Esquema para una solu- Salida: El maximo valor que puede contener una mocion.
chila de capacidad w.
procedimiento Ensayar(paso : TipoPaso)
1: para i 0 hasta N hacer
repetir
2:
C0,w Ci,0 0
Seleccionar candidato.
3: para i 1 hasta N hacer
si aceptable entonces
4:
para j 1 hasta w hacer
Anotar candidato.
5:
si Wi > w entonces
si solucion incompleta entonces
6:
Ci, j = Ci1, j .
Ensayar(paso siguiente)
7:
si no
si no acertado entonces
8:
Ci, j = max(Ci1, j , Ci1, jWi + Vi ).
Borrar candidato.
si no
12. Teora de grafos
Anotar solucion.
Hacer acertado cierto.
p
Para un grafo G con V(G) = {vi }i=1
, la sucesion
hasta que acertado=cierto o no haya candidatos
p
{grad
v
}
ordenada
en
forma
decreciente
se denomii i=1
fin procedimiento
na sucesion de grados de G. Una sucesion de enteros
Algoritmo 10.2. Esquema para todas las solucio- no negativos se dice grafica si es la sucesion de grados
nes.
de algun grafo.
procedimiento Ensayar(paso : TipoPaso)
p
Teorema 12.1 (Havel-Hakimi). Una sucesion {si }i=1
para todo candidato hacer
de enteros no negativos, con p 2 y di 1, es grafiSeleccionar candidato.
ca si, y solo si, la sucesion d2 1, d3 1, . . . , dd1 +1
si aceptable entonces
1, dd1 +2 , dd1 +3 , . . . , d p es grafica.
Anotar candidato.
si solucion incompleta entonces
Algoritmo 12.1. Creacion de un conjunEnsayar(paso siguiente).
to.
si no
1: funcion HC(x)
Almacenar solucion.
2: p(x) x, r(x) 0.
Borrar candidato.
fin procedimiento
Algoritmo 12.2.
12

1: funcion H(x)
2: mientras x , p(x) hacer
3:
x p(x).
4: devolver p(x)

8:
9:
10:

w S(Q).
para todo {vi , w} E tal que p(i) = hacer
M(vi , Q), M M\{i}, p(i) p(w)+1.

Algoritmo 12.7. Halla vertices de separacion y puentes.


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 un
puente.
1: para todo u V hacer
2:
cu W, u , au 0, su 0.
3:
para todo uv E hacer
4:
puv 0.
Algoritmo 12.4. Une conjuntos considerando el pe5: t 0.
so.
6: para todo u V hacer
1: funcion U(x, y)
7:
si cu = W entonces
2: E(H(x),H(y)).
8:
BPP(u).
9:
si au 1 entonces
10:
su = 0
12.1. Circuitos eulerianos
Algoritmo 12.3.
1: funcion E(x, y)
2: si r(x) > r(y) entonces
3:
x y.
4: si r(x) = r(y) entonces
5:
r(y) r(y) + 1.
6: p(x) y.
7: devolver y.

Teorema 12.2. Un grafo conexo contiene un circuito Algoritmo 12.8. Busqueda a primera profundidad para
euleriano si, y solo si, a) cada vertice es de grado par; el algoritmo anterior.
b) las aristas pueden particionarse en ciclos ajenos.
1: funcion BBP(u)
Algoritmo 12.5 (Hierholzer). Halla un circuito eule- 2: cu G, t t + 1, du Lu t.
3: para todo uv E v , u hacer
riano pegando circuitos.
4:
si cv = W entonces
Entrada: Un grafo conexo con todos sus vertices de
5:
v v, au au + 1.
grado par.
6:
BPP(v).
Salida: Un circuito euleriano C de G.
7:
Lu mn(Lu , Lv ).
1: Sea v V. Construir un ciclo C empezando en v.
8:
si Lv > du entonces
2: mientras E(C) , E(G) hacer
9:
puv 1.
3:
Sea w C, u V tal que {w, u} < E(C).
10:
si Lv du entonces
4:
Construir un ciclo C empezando en w en el gra11:
su 1.
fo G E(C).
12:
si no si dv < du entonces
5:
Insertar a C en lugar de w.
13:
Lu mn(Lu , dv ).
14: cu B, t t + 1, fu t.
15: fin funcion
12.2. Recorridos
Algoritmo 12.6. Al hacer recorrido por profundidad,
si el grafo no es conexo, marcar cada vertice visitado
apropiadamente.
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 hacer
2:
p(i) .
3: M {1, . . . , n}, c 0.
4: mientras V(M) = falso hacer
5:
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

12.3.

Caminos mnimos

En esta seccion, G(E, V, W) es un grafo con el conjunto de aristas E y el conjunto de vertices V, con una
funcion de peso W : E R. La arista que conecta a
los 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 cualquier vertice a otro distinguido s.

13

Algoritmo 12.9 (Inicializacion). Establece el estado Salida: Una funcion de distancias mnimas dv y de predecesores v para v V(G).
inicial de conocimiento de distancias y rutas mas cortas.
1: V = V {s}, E 0 = E, W 0 = W
2: para todo v V hacer
1: funcion I(s)
3:
E 0 = E 0 {e sv , evs }
2: d(s) 0, (s) 0.
4:
W(e sv ) 0, W(evs ) .
3: para todo v V con v , s hacer
5:
si
BF(G(E 0 , V 0 , W 0 ), d s , s , s) es falso
4:
d(v) , (v) N.
entonces
La arista euv se dice tensa si d(u) + W(euv ) < d(v).
6:
devolver Hay un ciclo negativo.
7: para todo euv E hacer
Algoritmo 12.10 (Relajacion). Si se encuentra 8: W 00 (euv ) d s (u) + w(euv ) d s (v).
una arista tensa, se relaja con la siguiente fun- 9: para todo v V hacer
cion.
10:
D(G(E, V, W 00 ), dv , v , v).
1: funcion R(euv )
11: para todo u V hacer
2: si d(v) > d(u) + w(euv ) entonces
12:
dv (u) d s (v) + dv (u) d s (u).
3:
d(v) d(u) + w(euv ), (v) u.
Algoritmo 12.14 (Floyd). Encuentra las distancias
4:
devolver verdadero.
mnimas entre todos los vertices de un grafo pesado
5: si no
G = (V, E, w) en tiempo O(|V|3 )
6:
devolver falso.
Entrada: Matriz de pesos w de un grafo con n vertices.
Algoritmo 12.11 (Dijkstra). Aqu B una cola de prio- Salida: Matriz de distancias mnimas d y de caminos
p.
ridad de los vertices con prioridad d sobre el mnimo. Siendo as, el tiempo de ejecucion del algoritmo 1: para i 0 hasta n 1 hacer
2:
para j 0 hasta n 1 hacer
es O(|E| + |V| log |V|).
3:
di, j wi, j , pi, j i {Inicializacion}
Entrada: Un vertice s V(G) como fuente.
Salida: Una funcion de distancias mnimas d y de pre- 4: para i 0 hasta n 1 hacer
5:
di,i 0.
decesores .
6:
para
k 0 hasta n 1 hacer
1: funcion D(G(E, V, W), d, , s)
7:
para i 0 hasta n 1 hacer
2: I(s)
8:
para j 0 hasta n 1 hacer
3: M(B, s).
9:
di, j mn(di, j , di,k + dk, j ), pi, j pk, j .
4: mientras B , hacer
5:
u =S(B).
6:
para todo euv E(G) hacer
12.4. Ordenamiento topologico
7:
si R(euv ) entonces
Algoritmo 12.15. Algoritmo de ordenamiento to8:
M(B, v).
pologico. Corre en tiempo O(|V|+|E|).
Algoritmo 12.12 (Moore-Bellman-Ford). Encuentra Entrada: Un grafo dirigido acclico G = (V, E).
los caminos mnimos con una sola fuente en un grafo Salida: Un ordenamiento lineal de V tal que y  x si,
pesado G(E, V, w) en tiempo O(|E||V|)
solo si, existe un camino dirigido de x hacia y.
1: Meter todos los vertices cuya valencia de entrada
1: funcion BF(G(E, V, W), d, , s).
es cero en una cola Q.
2: I(s).
2: mientras Q , hacer
3: para i 1 hasta |V| hacer
3:
Sacar a n de Q.
4:
para todo euv E(G) hacer
4:
devolver n.
5:
R(euv );
5:
para todo vertice m con una arista enm hacer
6: para todo euv E(G) hacer
6:
Quitar a e del grafo.
7:
si d(v) > d(u) + w(euv ) entonces
7:
si m no tiene otras aristas incidentes entonces
8:
devolver falso.
8:
Meter m a Q.
9: devolver verdadero.
12.3.2.

Entre todos los pares

12.5.

Mnimo a rbol generador

Algoritmo 12.13 (Johnson). Este algoritmo corre en Algoritmo 12.16 (Kruskal). Encuentra en tiempo
tiempo O(|V||E| + |V|2 log |V|).
O(|E| log |V|) el mnimo a rbol generador de un grafo co14

nexo pesado no trivial G


Salida: El mnimo a rbol generador F.
1: Ordenar E por peso y hacer F .
2: para todo v V hacer
3:
HC(v).
4: para i 1 hasta |E| hacer
5:
{u, v} ei .
6:
si H(u) , H(v) entonces
7:
U(u, v), F F {u, v}.

12.6.

14:
15:
16:
17:
18:
19:

13.

Grafos hamiltonianos

13.1.

si la etiqueta de t es (u, +, (t)) entonces


f (eu,t ) f (eu,t ) + 
si no si la etiqueta de t es (u, , (t)) entonces
f (et,u ) f (et,u ) 
t u.
V(Q) y M(Q, s).

Localizacion de patrones
Algoritmo KMP

Algoritmo 12.17. Para determinar un ciclo hamiltoniano de bajo peso en un grafo que satisface la desigualdad
del 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 a rbol generador T de G.
2: Recorrer T en una busqueda a primero profundidad
obteniendo la secuencia de vertices vi1 , . . . , vi p .
3: devolver vi1 , . . . , vi p , vi1 .

Algoritmo 13.1 (Knuth-Morris-Pratt). Localiza una


cadena en otra.
Entrada: Dos cadenas T y S , con |T | = n y |P| = m.
Salida: Una posicion k tal que T k T k+n1 = P, o falso si no existe.
1: j 1.
2: para i 1 hasta n hacer
3:
mientras j > 0 y T i , P j hacer
4:
j = ( j).
5:
si j = m entonces
6:
devolver i m + 1
j j + 1.
Teorema 12.3 (Dirac). Sea G un grafo de orden p 3. 7:
8:
devolver
falso.
Si grad v p/2 para cada v V(G), entonces G es
hamiltoniano.
Algoritmo 13.2. Calcula la funcion requerida en el

12.7.

Flujo maximo

Algoritmo 12.18 (Ford-Fulkerson). Este algoritmo


solo funciona si las capacidades de las aristas son racionales. Si Q es una cola, entonces el algoritmo corre
en 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 , hacer
4:
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 ) hacer
6:
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 hacer
9:
Etiquetar a v con (u, , mn((u), f (euv ))).
10:
M(Q, v).
11:
si t esta etiquetado entonces
12:
 (t).
13:
mientras t , s hacer

algoritmo anterior.
Entrada: Una cadena P con |P| = m
Salida: La funcion .
1: j 0.
2: para i 1 hasta m hacer
3:
si Pi = P j entonces
4:
(i) ( j).
5:
si no
6:
(i) j.
7:
mientras j > 0 y Pi , P j hacer
8:
j ( j).
9:
j j + 1.

13.2.

Deteccion de periodicidades

El borde de una cadena C = c0 . . . cn1 es la subcadena propia de longitud maxima B = c0 . . . cb1 de C tal
que B = cnb . . . cn1 .
Algoritmo 13.3. Calculo en tiempo O(n) de las longitudes de los bordes de los prefijos de la cadena C =
c0 . . . cn1 .
Entrada: Una cadena C con |C| = n
Salida: Un arreglo de las longitudes de los bordes B
tal que Bi es la longitud del borde de la subcadena
c0 . . . ci .

15

1: B0 0.
2: para i 0 hasta n 1 hacer
3:
b Bi .
4:
mientras b > 0 y Ci+1 , Cb hacer
5:
b Bb+1 .
6:
si Ci+1 = Cb entonces
7:
Bi+1 b + 1.
8:
si no
9:
Bi+1 0.

a=borrar_ceros(a); b=borrar_ceros(b);
if(a.size()<b.size()) return true;
else if(a.size()>b.size())
return false;
else return a<b; }

Sea b la cardinalidad del borde B de C. Entonces


C consta de b np c cadenas iguales de longitud p, donde
n = |C| y p = n b, y p es el menor numero con esa
propiedad. Si p\n, entonces la cadena es periodica con
periodo p.

14.

Cuestiones miscelaneas

string suma(string a, string b) {


string ans(""); int k=0;
if(a.size()<b.size()) swap(a,b);
int j = a.size()-1, i = b.size()-1;
for(; j>=0; j--,i--){
int u = a[j]-0;
if(i>=0){
ans += (u+(b[i]-0)+k)%10+0;
k = (u+(b[i]-0)+k)>=10; }
/* ans += (u-(b[i]-0)+k+10)%10+0;
k = 0-((u-(b[i]-0)+k)<0);} */
else{
ans += (u+k)%10+0;
k = (u+k)>=10; } }
/* ans += (u+k+10)%10+0;
k = 0-((u+k)<0); } } */
if(k) ans += 1;
reverse(ans.begin(),ans.end());
return ans; }

double 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 subconjunto de la cadena.
string.replace(posicion,nelementos,subcadena)
Reemplaza un subconjunto de una cadena.
string::size type s1.find(s2) Devuelve la posicion de string mult(string a, string b){
la cadena s2 en s1. Si falla devuelve npos. Si npos int n = a.size(), m = b.size();
int t,k,i; string ans(m+n,0);
esta ocupado, se lanza un range error.
string.substr(posicion,nelementos) Extraer un sub- for(int j = m; j>0; j--){
for(i = n,k=0; i>0; i--){
conjunto de una cadena.
t = ((a[i-1]-0)*(b[j-1]-0));
void erase(iterator pos) Elimina el elemento apuntat += (ans[i+j-1]-0)+k;
do por pos en un conjunto.
ans[i+j-1] = (t%10)+0;
size type erase(const key type& x) Elimina el elek = t/10;}
mento x de un conjunto.
ans[j-1]=k+0; }
return
borrar_ceros(ans); }
Aritmetica de precision arbitraria implementada con
cadenas.
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<a.size()-1) i++;
return a.substr(i,a.size()-i); }

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<N;i++) {
res =(res*10)+(a[i]-0);
temp +=(res/d+0); res = res%d; }
return borrar_ceros(temp); }
string divide(string u, string v) {
string d(""),ans(""),parcial("");
string temp1(""),temp2("");
vector <string> mul;

bool menor(string a, string b) {


16

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<10;k++)
mul.push_back(suma(mul[k-1],v));
m = u.size()-v.size()-1;
while(j<=m)
{
a1 = u[j]-0; a2 = u[j+1]-0;
a3 = u[j+2]-0; a4 = v[0]-0;
a5 = v[1]-0;
if(a1==a4) q = 9;
else q = (a1*10+a2)/a4;
while(q*a5>((a1*10+a2-q*a4)*10+a3))
q--;
parcial.erase();
for(int l=j;l<j+v.size()+1;l++)
parcial += u[l];
if(menor(parcial,mul[q])) q--;
temp2 = resta(parcial,mul[q]);
for(int l=j;l<j+v.size()+1;l++)
u[l] = temp2[l-j];
ans += (char)(q+0); j++;
}
return borrar_ceros(ans); }

//Lee cadenas y las pasa a temp.


while(in >> temp)
cout << temp << endl;

Extraccion de datos listados en una sola fila cuando no


se especifica su numero.
cin.getline(conjuntos, 1000);
ptr = strtok(conjuntos," ");
while(ptr!=NULL) {
numero=atoi(ptr); B.insert(numero);
ptr = strtok(NULL, " "); }
Leer datos cuando no especifican cuantos son.
#include <sstream>
int i; double f; string cad,temp;
// Delimitador del .
// getline(cin, cad,.);
//Para leer muchas cadenas
getline(cin, cad);
istringstream in(cad);
// Pero como esta esta cosa
// lee primero un entero.
in >>i; cout<<i*10<<endl;
17