Sunteți pe pagina 1din 15

Primer Algoritmo

1.

Introducci
on

Para este primer algoritmo, dado la cantidad de participantes y dado un conjunto de pares donde
cada par representa un partido arreglado, queremos averiguar para que participantes el torneo puede
estar hecho para que lo gane. Si queremos que gane un participante x debe ocurrir que exista al menos
una forma de armar la estructura de encuentros del torneo de manera tal que no dependa del azar para
lograrlo (es decir, ganar gracias a los partidos arreglados). Primero vamos a presentar el modelado del
problema mediante grafos. Posteriormente, veremos de que manera algoritmica se lo puede resolver, y
finalmente se har
a el estudio de la complejidad del algoritmo presentado.

2.
2.1.

Descripci
on del problema y del algoritmo
Representaci
on del problemas con grafos

Como dijimos anteriormente, deseamos un algoritmo que nos devuelva la lista de participantes
para los cuales el torneo puede arreglarse, a partir del n
umero de participantes totales y los pares
ordenados de partidos arreglados. Antes de proceder a explicar el algoritmo, vamos a describir el modelo
de grafo que se opt
o para su resoluci
on.
Vamos a representar un ejemplo: dado un torneo de 4 participantes, se sabe que el partido del
primer participante y el segundo est
a arreglado, al igual que la del tercero y el cuarto. La figura 1.1 es
un digrafo que representa cada nodo como un participante y una flecha que define el partido arreglado.
El origen de una flecha dada determina el ganador del partido arreglado y el que recibe dicha flecha
es el que pierde. Un digrafo donde los nodos son los participantes y los ejes representan los partidos
arreglados ser
a el modelo elegido para resolver el problema.

Figura 1.1: ejemplo n = 4, y los pares de arreglo de partidos (1,2)(3,4)

Para cualquier jugador que siempre disputa partidos arreglados que estan a su favor, sabemos
que este ganara de seguro el torneo. En el ejemplo presentado no hay ning
un tenista para el cual se
puede arreglar el torneo a priori. Parecera que uno de nuestros candidatos para poder arreglar el torneo
es el jugador 1 (debido a que 2 y 4 dependen de la suerte o pierden en los partidos que son arreglados).
1

En este caso, podra armarse un torneo donde 1 juegue un solo partido y que dicho partido sea en lo
posible contra el participante 2. Sin embargo, este factor parece estar librado a la suerte debido a que el
jugador 2 no posee ning
un arreglo con respecto al resto (de modo que tendra que depender meramente
de su habilidad atletica para avanzar de ronda y llegar a enfrentarse con 1). Como para que el jugador
2 llegue a la final con el participante 1 depende puramente del azar con el que se dan los partidos, no
existe una distribuci
on del fixture tal que dicho jugador gane el torneo. Esta claro que si el participante
1 juega primero con alguno de los otros con los cuales no tiene arreglo, tambien dependera de la suerte, y
que consecuentemente no habr
a un fixture que determine al participante 1 como ganador. Analogamente
ocurre con el participante 3.
As vemos que no alcanza con que un participante dado tenga partidos arreglados a su favor sino
que tambien depende de que para el participante con el cual arreglo, llegue a la instancia con el primero
sin depender de la suerte. En otras palabras y aplicado al ejemplo de la figura 1.1, si queremos que 1
gane el torneo, venciendo a priori a 2, entonces 2 tiene que asegurarse de llegar a dicha disputa. Por
esto, 2 tiene que arreglar partidos para llegar a dicha instancia con uno en especial del resto de los
contendientes. Lo mismo va a ocurrir para aquel que va a perder a proposito con 2, y analogamente
con este que perder
a con el que perder
a con 2 y as siguiendo. Si existe alguno que no entra en esta
relaci
on en donde se tiene que ganar para luego perder a drede (todo mediante arreglos) entonces este
puede llegar a ganar el torneo porque no hay ning
un arreglo que se lo impida. De modo que si vemos la
figura 1.1 nuevamente, el participante 1 no puede ganar el torneo con los arreglos existentes porque hay
al menos un factor librado al azar que puede llegar a irrumpir con el objetivo de que 2 llegue a disputar
con 1. Los participantes 3 y 4 podra llegar a la instancia en la que se juega directamente con 1 y as,
despojandole del torneo al u
ltimo. Si queremos que 2 dispute la final con 1, entonces 2 tiene que disputar
la semifinal con alguno donde el partido este arreglado. En la figura 1.2 se muestra que 1 puede ganar
el torneo mediante el arreglo de partidos, debido a que ya se sabe que este disputara su final con 2, que
a su vez, juega un partido anterior contra 3 en el que gana; y 3 le gana a 4 en el partido arreglado.

Figura 1.2: ejemplo n = 4, y los pares de partidos (1,2)(3,4)(2,3). El participante 1 le gana


indirectamente a todo el resto de los participantes

As podemos definir una relaci


on de transitividad en el cual si se quiere que un participante
cualquiera pueda ganar el torneo, entonces este tiene que ganarle indirectamente a todos los participantes.
Diremos que un participante a le gana indirectamente a otro b si entre ambos hay un partido arreglado
o si para alguno de los que le gana mediante un partido arreglado llamado c, c le gana indirectamente
a b
En la figura 1.2 vemos que 1 le gana indirectamente a 2 porque hay un partido arreglado entre
ellos, y que 1 le gana indirectamente 3 porque 2 le gana indirectamente; lo mismo ocurre cuando decimos
que 1 le gana indirectamente a 4 porque 1 le gana indirectamente a 3.
Definiremos algunos conceptos antes de continuar con la explicacion. En vez de decir que un
nodo le gana indirectamente a otro, vamos a definir que existe un camino entre ambos nodos. Tambien
podemos definir que existe un camino entre dos nodos si a partir de un nodo de origen se puede llegar a
2

otro mediante el seguimiento de una sucecion de ejes adyacentes, respetando la orientacion. Esto u
ltimo
quiere decir que tambien importa el sentido del eje en el momento de realizar el seguimiento.
Por ejemplo, en la figura 1.3 se muestra a la derecha que (1,2) y (2,3) determina un camino
direccionado entre 1 y 3, que a su vez determina un camino entre 1 y 2, y 2 y 3. No as, si tenemos las
tuplas (1,2) y (3,2) como ocurre a la izquierda, obtenemos un camino direccionado entre 1 y 2, y otro
que comunica 3 y 2, pero no hay un camino entre 1 y 3 como ocurra anteriormente. Diremos que para
un par de nodos adyacentes (tomar definicion dado en la teorica del mismo), el nodo del cual surge el
origen del eje direccionado que los une, es el padre y sobre el otro al cual recae, es el hijo.

Figura 1.3: dos digrafos de igual cantidad de nodos donde se muestran todos los caminos
existentes

Para que un participante x pueda ganar el torneo, se necesita que este le gane indirectamente a
todos los participantes restantes. Por lo que acabamos de decir, si existe alguno contra el que no se le
puede ganar indirectamente llamado y, entonces existe la suerte de que y le gane a todos y consiga el
torneo, porque no hay ning
un partido arreglado que se lo impida.
Para dicha demostraci
on vamos a suponer que existe un nodo x que es solucion pero que de
dicho nodo no se puede realizar un camino a todos los demas nodos. Llamaremos como y a aquel del
cual no se puede llegar a partir de x. Sabemos que una de las condiciones que se tiene en la consigna
es que todos los jugadores tienen que jugar. El participante y entonces jugara contra alguno de los que
le gana indirectamente x o el mismo jugador x. Si ocurre lo u
ltimo, sabemos que nada impide que
pueda ganar y por lo que x no puede ser solucion. Entonces, vamos a considerar el primer caso. Si
no existe un camino entre x e y, tampoco lo tendra ninguno de los nodos que tienen un camino entre
x, con y. De modo que para cualquier nodo que es destino de x, y puede ganarles porque no hay
nada que se lo impide. As llegamos a la conclusion de que no hay una solucion en el caso de que a
partir de cualquier nodo, no se pueda trazar un camino al resto de los nodos. En particular en el digrafo
que representa el problema, si de un nodo se puede llegar a cualquiera de los otros nodos mediante un
camino direccionado, entonces dicho nodo es una solucion al problema. Esto coincide con el hecho de
que un equipo tenga que poder ganarle indirectamente a todos los demas para conseguir el torneo.
Un digrafo se dice fuertemente conexa si para cualquier nodo del mismo existe un camino dirigido
hacia cualquiera del resto. Definiremos tambien como una componente fuertemente conexa de un grafo
como un subgrafo del mismo donde cumple con la propiedad de ser un digrafo fuertemente conexa.

Figura 1.4 Aqui se muestran dos ejemplos particulares de componentes fuertemente conexas para
n=4 y n=5. Tomando cualquier nodo se puede llegar a cualquiera del resto. Si tomamos que la
grafica es un solo grafo, entonces tendriamos dos componentes fuertemente conexas

Nuestro algoritmo consistir


a b
asicamente en 2 partes: primero dado un digrafo que representa
el problema, realizaremos el reconocimiento de todas las componentes fuertemente conexas. Luego para
cada una de las componentes fuertemente conexas encontradas las transformaremos en un u
nico nodo
que la representa para un digrafo nuevo. Sobre este u
ltimo se trazaran ejes que describen la manera en la
cual dichas componentes conexas est
an relacionadas. A partir de algunas propiedades nuevas inherentes
al digrafo cuyos nodos representan las diferentes componentes conexas, lograremos resolver el problema
planteado.
El algoritmo que utilizamos que nos reconoce todas las componentes fuertemente conexas maximales se atribuye a Tarjan. Veremos a continuacion ciertos conceptos y luego haremos un analisis del
modo por el cual dicho algoritmo nos devuelve aquello que mencionamos anteriormente.

2.2.

Algoritmo de Tarjan

El algoritmo de Tarjan es en escencia una modificacion del algoritmo de DFS (Depth First Search).

Este
ultimo consiste en recorrer sucesivamente a partir de un nodo dado, a sus sucesores yendo en lo
posible hacia su mayor profundidad. As, su criterio de recorrido es siempre digirse hacia el hijo proximo,
y bajar a partir del nodo inicial lo m
as que se pueda (a diferencia de otros algoritmos de recorrido de
grafos donde se recorren por nivel con respecto al nodo inicial ni , metodo denominado BFS que no nos
es de mucha importancia para este problema). Cada nodo formado por el arbol generado por DFS tiene
un orden de visita, y esta se define como el orden por el cual es visitado cierto nodo a partir del nodo raiz
en el recorrido realizado por DFS. Por default, el nodo raiz tiene orden de visita uno. Luego, por lo que
definimos el primer hijo que encuentra tiene orden 2, y al hijo del hijo 3 y as siguiendo. Algo particular
con respecto con DFS es que emplea una estructura de pila (stack) a partir de un nodo inicial se apilan
todos aquellos a los que incide, y luego desapilo y vuelvo a ejecutar lo que se dijo recien. De ocurrir que
no puede apilar sucesores directos, entonces, simplemente de desapila, y en caso de no poder desapilar
m
as significa que no existen m
as elementos por recorrer, por lo que el algorimo termina en dicho caso.
A partir de ejecutar DFS sobre un cierto nodo del digrafo G, nos queda determinado un bosque
(digrafo sin ciclos) donde existe un subarbol T cuya raiz es ese mismo nodo de donde se partio DFS, y
una serie de nodos a los cuales no se llegaron a recorrer por dicho DFS. Los nodos de este subarbol T son
todos aquellos a los que se pueden llegar a partir de ni . Tambien podemos decir que en el conjunto de
dichos nodos de T est
a incluido el conjunto de nodos ci de los cuales pertenecen a la misma componente
fuertemente conexa maximal a la que est
a ni (este conjunto de ci podra ser vaco tambien). Esto vale
debido a que sabemos que para cada par de nodos de una componente, existe un camino de uno hacia el

otro y viceversa, y el arbol determina un camino unidireccional hacia un cierto conjunto de nodos, pero
no conocemos si a cada uno de estos nodos vuelve hacia el mismo origen ni .
En lneas generales, la idea del algoritmo de Tarjan es recorrer todo lo maximo posible a partir de
un nodo inicial, y en simultaneo verificar que para cada nodo recorrido haya un camino que vuelva hacia
el nodo inicial. Iremos marcando aquellos vertices de los cuales ya le hicimos la correspondencia hacia
una componente fuertemente conexa. Luego repetiremos esta operacion para nodos nuevos no visitados
hasta que estas se agoten. El resultado final sera una correspondencia unvoca de cada nodo hacia una
sola componente conexa maximal.
Recorrer a partir de un nodo ni hacia todos sus posibles destino ya dijimos que se puede realizar
mediante DFS. La pregunta importante es De que forma se puede saber si vuelve hacia el nodo origen?
La soluci
on obvia del problema sera realizar un DFS para cada nodo sucesor a ni , recorriendo los ejes
en sentido contrario a aquel natural en el digrafo original y verificar si llega a ni . Sin embargo, hay una
mejor manera de hacerlo a fin de amortizar costos de complejidad. Para lograr esto, vamos a definir una
variable que ser
a conocido como lowlink. Esta variable define lo siguiente: sea el subarbol T generado
por DFS sobre un nodo raiz ni , el lowlink de cada nodo v es el mnimo orden de visita de algun sucesor
directo o indirecto w. A su vez, dicho nodo w tiene que ser antecesor de la raiz ni . Por defecto, si no se
encuetra esto, su lowlink es equivalente a su orden de visita de si mismo.
Realizaremos algunas observaciones con respecto a lo definido anteriormente. Si ocurre que dado
un nodo v si su lowlink y su orden de visita de un nodo v son iguales, podemos afirmar que no pertenenen
a una misma componente fuertemente conexa al de la raiz ni . Mas a
un, tampoco perteneceran aquellos
sucesores de v. Si miramos la pila empleada en DFS, teniendo la posicion de v, los que estan apilados
sobre el son sus sucesores, de modo que ningun de ellos pertenecen a la componente en la que se ubica ni .
A su vez, v y sus sucesores pueden desmantelarse en otras diferentes componenes en el caso de que exista
algun sucesor v1 que tenga lowlink y orden de visita iguales, en cuyo caso los sucesores de v1 forman
una componente conexa diferente al constituido por v y sus sucesores pero que no son sucesores de v1 .
Podemos hacer estas separacionesde distintas componentes a partir de la ejecucion del algoritmo de
Tarjan, distinguiendo as todas las componentes cuyos nodos coincide con el subarbol resultante en su
recorrido.
Anteriormente mencionamos que realizar DFS (y en particular tambien el algoritmo de Tarjan
)sobre ni , determina un bosque con los mismos nodos que el original, y que en particular haba un
arbol en el cual se hallaba ni . No comentamos a

un que ocurre con el resto de los subarboles que no son


recorridos por dicho algoritmo sobre ni . No es dificil imaginar que estos subarboles restantes son todos
compuestos por un s
olo nodo. Lo que haremos ahora es tomar uno de esos nodos (digamosle nj )que no
se han recorrido en la ejecuci
on del algoritmo de Tarjan sobre ni . A partir de nj hacemos una nueva ejecuci
on de Tarjan, obteniendo una serie de componentes fuertemente conexas. Si a
un as, sigo obteniendo
nodos no recorridos en G, tomo uno y le aplico Tarjan. As continuamos hasta haber mirado todos los
nodos, y el resultado final es la obtenci
on de todos las componentes fuertemente conexas maximales en
G

2.3.

Las componentes fuertemente conexas y la soluci


on al problema

La obtenci
on de estas componentes fuertemente conexas maximales nos interesa porque nos permite agrupar nodos de los cuales si sabemos que uno de ellos es solucion, el resto que son pertenecientes
a esa misma componente conexa (de aqu en mas solo llamado componentes)tambien lo sera.
Supongamos estamos trabajando sobre un grafo G cuya cantidad de componentes fuertemente
conexas maximales es de k. Tambien supondremos que existe un nodo n1 pertenciente a una componente
c1 del cual se comunica mediante alg
un camino dirigido con la sucesion de nodos n2 , n3 ,...,nk , y donde
para cada uno de estos u
ltimos, pertenecen a componentes diferentes c2 , c3 ,...,ck , como se muestra en la

figura de abajo. El nodo n1 se comunica con todos los que estan en su misma componente, (inherente a
la definici
on de componente fuertemente conexa). Sabemos por hipotesis que n1 se comunica con n2 , de
modo que por transitividad se comunica tambien con el resto de los nodos pertenecientes a la componente
c2 . Esto tambien ocurre para un n1 donde hay un camino a n3 , y por ende tambien a todos los dem
as
que pertenencen a c3 , idem con n4 y as hasta nk . De este modo n1 se comunica al resto de los nodos
que no son pertenecientes a c1 . Pero a su vez n1 se conecta con todos los nodos de c1 . As resulta que
n1 debido a que llega por al menos un camino al resto de los nodos. Esto mismo ocurre si elegimos otro
nodo perteneciente a c1 , porque del mismo llega a n1 , que a su vez llega a todo el resto. As concluimos
que todos los elementos de dicha componente son solucion al problema.

Figura 1.5

Para simplificar el an
alisis previo realizado, crearemos un nuevo digrafo G. As una vez conseguido
las diferentes componentes fuertemente conexas mediante el algoritmo de Tarjan, vamos a representar un
nuevo digrafo (al que llamaremos G) en el cual sus nodos son dichas componentes. Sus ejes direccionados
describen si de una componente conexa se puede llegar a otra a partir de un eje del digrafo original.
El digrafo G posee una propiedad que nos permitira despejar el resultado final y este consiste en la
inexistencia de ciclos. Si recordamos que cada nodo es una componente conexa de G, en el caso de que
para dos componentes c1 y c2 pertenezcan a un ciclo, entonces para cualquier nodo en c1 se puede trazar
un camino a cualquier nodo perteneciente a c2 . En otras palabras, para cualquier nodo n1 perteneciente
a c1 puede llegar a cualquier nodo de c2 y para cualquier otro n2 en c2 puede alcanzar a todos los nodos
de c1 . As c1 y c2 son en realidad una sola componente conexa, y esto rompe con la postcondicion del
algoritmo de Tarjan del cual se describi
o anteriormente (porque despeja las componentes fuertemente
conexas maximales).
Antes de proseguir y explicar que se hara con todas las componentes fuertemente conexas conseguidas, vamos a explicar un caso especial que puede llegar a ocurrir en nuestra representacion al

problema. Esta
corresponde al caso en el cual el digrafo no posee ciclos.
Para dicho caso un nodo con grado de entrada igual a 0 es condicion necesaria para que pueda
alcanzar al resto de los nodos en un digrafo sin ciclos. Si tenemos un nodo con grado de entrada mayor
estricto a 0 (al que llamaremos a), entonces quiere decir que hay un nodo del cual incide directamente
sobre el mismo (al que conoceremos como b). Ya sabemos que a no puede ser solucion porque existe
un nodo b que lo puede llegar a perjudicar en el arreglo de partidos, y dijimos con anterioridad que
una soluci
on cumple con la propiedad de poder alcanzar a cualquier nodo restante a partir del mismo.
De este modo, esto se cumple a menos que a supere tambien a b. En particular, partiendo de b se
puede llegar a a, pero no se cumple la recproca debido a que si tambien existe un camino dirigido de
a a b, la uni
on de ambos caminos determinan un ciclo, y digimos en principio que esto no ocurre en

nuestro an
alisis. Que un nodo tenga grado de entrada igual a 0 quiere decir que no existe alguien que
sea su padre (y en terminos del problema presentado no hay ning
un participante que le pueda llegar a
ganar mediante los arreglos existente de partidos). Decimos que es condicion necesaria porque podra
ocurrir que tenga grado de entrada igual a 0, pero que a
un as no representa una solucion al problema
Que ocurre cuando existe m
as de un nodo con grado de entrada igual a 0? Si tenemos dos nodos
x e y con grado de entrada en 0, quiere decir que ninguno tiene padre alguno. Ese hecho se traduce
a que ni x es padre de y, ni viceversa. Partiendo de ninguno de los dos se puede llegar al otro, de
modo que en el caso de que existan dos nodos con grado de entrada igual a 0, sabremos que no hay una
soluci
on para el problema final.
Con todo esto en mente vamos a buscar el nodo del digrafo condensado G cuyo grado de entrada
sea igual a 0, y asegurarnos de que esta sea la u
nica que posea dicha propiedad con la finalidad de
asegurarnos la existencia de una soluci
on. Luego de encontrar ese nodo en G, vamos a traducirlo en
cuanto a sus nodos correspondientes en G, y devolveremos estas como solucion final al problema. Como
ejemplo, en la figura anterior, el algoritmo reconocera a c1 como componente solucion, pasara a al grafo
G y finalmente devuelve todos los nodos de G que constituyen a dicha componente.
Esto se realiza a partir de la declaracion de un arreglo de booleanos A cuyo tama
no es equivalente
a la cantidad de componentes fuertemente conexas encontradas por el algoritmo de Tarjan. Luego, nos
fijaremos uno por uno los ejes que determinan los arreglos de partidos entre jugadores. A partir de un
arreglo B de tama
no n donde cada posicion del mismo representa un jugador y su contenido es el n
umero
de la componente fuertemente conexa al que pertenece, nos permitira determinar el grado de entrada
para los nodos de G. Si un eje que parte de un nodo perteneciente a una componente llega a otro, que
pertenece a otra componente, entonces la componente del cual es destino, tiene un grado de entrada
mayor a 0, de modo que se lo marca para desestimarlo como solucion. Mirando los m ejes, obtengo un
estado final en el arreglo A, y simplemente se verificara que en ella exista solamente una posicion que no
este desestimado como posible soluci
on. Dicha posicion corresponde a la componente solucion de modo
que se devolver
an todos aquellos pertenecientes a el. Esto se realiza gracias al arreglo B, mirando uno
por uno y verificando su pertenencia a la componente solucion. De no haber una unica desestimacion en
el arreglo A, no devolveremos que no hay solucion final para el problema

Figura 1.6: Para el primer grafo de la izquierda tenemos que el nodo 1 es soluci
on debido a que
es el
unico con grado de entrada igual a 0, mientras que en el segundo digrafo no ocurre
as
porque el nodo 1 y 5 poseen grado de entrada igual a 0, y esto por lo que dijimos no
determina una soluci
on

En el digrafo G cada nodo representa el compactado de las componentes fuertementenes conexas en el


grafo G y la existencia de un eje direccionado entre dos nodos de G esta determinada por la existencia
de alg
un eje direccionado que comunique ambas componentes. Es evidente que puede existir mas de
un eje direccionado que comunique a dos componentes, aunque no puede pasar que exista dos ejes que
las comunique en sentido contrario. Dijimos que G no posee ciclos. Si uno de esos nodos es solucion,
7

entonces este hecho se traduce a que en el grafo G existe un grupo de soluciones correspondientes a
aquellos representados por el nodo ganador en G. Estos nodos de G seran solucion dado que a partir de
cualquiera de ellos, existe un camino que los conecta a cualquiera de todas las componentes fuertemente
conexas del digrafo original G.

Figura 1.7: A partir de lo obtenido en el algoritmo de Tarjan, condensamos sus componentes


conexas y las transformamos en un uno para un nuevo digrafo G. Posteriormente despejamos el
nodo del digrafo que tenga grado de entrada igual a 0 y que sea
unico, y en base a dicho
resultado devolveremos los nodos que constituyen a la componente encontrada

De esta forma simplemente necesitamos encontrar primero el nodo de G cuyo grado es igual a 0. De ser
esta u
nica, se devuelve sus correspondientes nodos de G al que representa. Dichos nodos de G conforman
una componente fuertemente conexa y ser
a solucion final a problema presentado.

3.

Pseudoc
odigo
Ej1 ingresan(n:int,m:int,pares:tuplas(int int))-devuelven(lista:int)
01.
inicializo p y c en 01
02.
Crear un arreglo CFC que indica a que componente fuertemente conexa esta c/participante
03.
Crear un arreglo low que indica el lowlink de cada participante
04.
Crear un arreglo ordVisita que indica el orden de visita de cada participante
05.
Crear un arreglo marcado? que indica si un participante fue marcado
06.
Crear un arreglo apilado? indica si un participante esta en la pila2
07.
armo lista de adyacencia listAdy para cada nodo donde se indica a sus sucesores directos
solamente
08.
creo una pila stack
09.
tarjan(n,p,c,CFC,ordVisita,marcado?,apilado?,stack)
10.
crear arreglo de bool A de tama
no cant de comp conexas seg
un lo obtenido en tarjan3
11.
para cada eje e dado por pares

1 p es una variable que determina la profundidad acumulada de un DFS determinado, y c es un contador de componentes
fuertemente conexas
2 para CFC est
an todas sus casillas inicializadas en -1(que quiere decir que todavia no se determin
o su componente),
para low y ordVisita est
an inicializadas en 0 y los dos u
ltimos que son booleanos est
an en false. La longitud de todos los
arreglos son de n
3 inicializado todo en true

12.
13.
14.
15.
16.
17.
18.
19.
20.

si origen de e != destino de e hacer


setear en falso para la componente del cual pertence el destino de e en A4
para cada posici
on del primero al u
ltimo de A
si haba encontrado un true antes hacer
parar y devolver que no hay solucion
sino hacer
si hay un true hacer
recordar posicion en variable res
devolver todos los nodos de la componente res

donde...
tarjan ingresan(n,p,c,CFC,ordVisita,marcado?,apilado?,stack)-devuelven(-)
01a.
para cada participante i de 1 a n
02a.
si est
a en true hacer
03a.
procederTarjan(i,p,c,CFC,ordVisita,marcado?,apilado?,stack)
04a.
sino, se sigue de largo
procederTarjan ingresan(i,p,c,CFC,ordVisita,marcado?,apilado?,stack)-devuelven(-)
01b.
apilar i en stack
02b.
marcado?[i] = true
03b.
apilado?[i] = true
04b.
ordVisita[i] = p
05b.
incrementar en uno p
06b.
low[i] = ordVisita[i]
07b.
para cada sucesor directo i de i
08b.
si es false en marcado?[i] hacer
09b.
procederTarjan(i,p,c,CFC,ordVisita,marcado?,apilado?,stack)
10b.
low[i] = min (low[i], low[i])
11b.
sino hacer
12b.
si i est
a en stack
13b.
low[i] = min(low[i], ordVisita[i])
14b.
si low[i] == ordVisita[i]
15b.
CFC[i] = c
16b.
apilado?[i] = false

4.

Detalle de implementaci
on

Como observamos en el pseudoc


odigo, empleamos estructuras de arreglo y la de pila. Para este
u
ltimo utilizamos una librera de C++ conocida como list, que en naturaleza es una lista doblemente
enlazada, cuyas operaciones que se mencionaran a continuacion tienen orden costante. Para apilar empleamos su correspondiente funci
on agregar a atras y desapilar corresponde a sacar de atras.

4 si queremos mirar a qu
e componente pertenece se emplea el arreglo CFC y su costo es obviamente O(1) para ver cada
nodo

5.

C
alculo de complejidad

Vamos a cosiderar el modelo uniforme para el calculo de complejidad debido a que nos interesa
conocer el costo que implica realizar las operaciones generales que determinan ciertas propiedades del
digrafo que nos permita resolver el problema. Consideramos que el costo de las operaciones elementales
pasan a estar en un segundo plano a la hora de realizar el calculo de la complejidad total y por ende,
ser
an consideras todas ellas con un costo de orden constante.
Observando en detalle el pseudoc
odigo, el costo de las lineas 1 a 8 tiene un costo de O(n).
Como mencionamos anteriormente, el algoritmo de Tarjan que aparece en la linea 9, obtiene las
componentes fuertemente conexas para los nodos alcanzados en su recorrido. La subrutina procederTarjan de dicho algoritmo es una especializacion de DFS cuya complejidad esta en el orden de O(m+n).
En dicho algoritmo se va apilando progresivamente los hijos de los nodos (cuando existen o no fueron
visitados), se toma el primer desapilado, y se repite estos dos pasos anteriores hasta que no se pueda
desapilar m
as (cuyo caso tendriamos una pila vaca). Sabemos que el algoritmo llega a apilar todos los
nodos de los cuales son alcanzables por un nodo tomado como origen, a cuya cantidad diremos que
es vi . Luego tambien sabemos que para cada nodo se miran hacia cuales otros son incidentes. Estas
observaciones de ejes incidentes cuestan a lo sumo la suma de todos los ejes que salen por cada nodo, al
que llamaremos ei . A esto se agrega a las asignaciones de la variable lowlink y orden de visita que son
considerados en orden constante debido al modelo elegido, su complejidad no aumenta en su orden de
modo que procederTarjan tiene una misma complejidad que realizar un DFS sobre un nodo determinado.
Sabemos que la suma de todos los vi y ei , resultan en n y m respectivamente. Realizar procederTarjan
cuesta vi y ei para un nodo ni , y el resultante de recorrer todos los nodos dara que la complejidad es
O(m+n).
El costo de la linea 10 puede ser como maximo n, y este corresponde al caso del digrafo en el
cual cada nodo es una componente fuertemente conexa independiente. Por ende se creara un arreglo de
tama
no de a lo sumo n.
La iteraci
on realizada desde la lnea 11 a 13 cuesta O(m), debido a que se miran los pares de ejes
de arreglos de partidos uno por uno para determina los grados de entrada sobre los nodos que representan
la condensaci
on de componentes fuertemente conexas.
Luego desde la lnea 14 a 19 verifica la existencia de un resultado, mirando si hay un solo nodo
condensado cuyo grado de entrada es equivalente a 0. Para realizar esta rutina, tiene que mirar la
totalidad del arreglo A, cuya longitud m
axima ya dijimos que esta acotada por n. De esta forma tenemos
que su costo es O(n). De no haber un resultado, el algoritmo termina en este momento, de modo que la
complejidad resultante hasta ese entonces resulta en O(m+n)
Finalmente, la ultima linea del algoritmo principal usa el arreglo CFC para devolver las soluciones,
que por lo pronto necesita mirar cada una de las n posiciones que la compone. De modo que su costo
ser
a O(n)
Este u
ltimo paso culmina con la resolucion del problema. La complejidad final corresponde a
la cota superior de operaciones para cada una de las lineas descriptas, por lo que se concluye que es
O(m+n). As sabemos que el orden de complejidad no vara para el mejor caso (cuando no lo hay)y el
peor(cuando hay soluci
on)
Hasta el momento solamente hablamos de la complejidad en base a las variables n y m. Tambien
podemos considerar la complejidad en base al tama
no de entrada entragada al algoritmo. El tama
no de
entrada total est
a dado por la longitud de la tira de bits que representa n, m y la suma de las longitudes
de bits que representan cada uno de los pares que determinan el arreglo de partidos. Estos u
ltimos no
nos interesa demasiado porque son factores independientes al orden de complejidad final. Teniendo en
cuenta esto podemos expresar los tama
nos de entrada como:
tn = log n, tm = log m, ttuplas =

m
X
i=1

10

pi

donde pi son el tama


no de entrada especfico de los distintos pares de partidos arreglados. Podemos
interpretar que para cada par, hay dos tiras de bits (Mas especficamente cada tira de bit no sera m
as
grande que la tira de bits del n
umero n). El tama
no total de entrada sera:
ttotal = tn + tm + ttuplas
Podemos acotar ttuplas a m teniendo en cuenta que para cada pi , la longitud mnima siempre es 1. Esto
repetido en m veces resulta que:
ttotal tn + tm + m
ttotal m
Luego si analizamos n y m, el primero puede ser mayor a segundo, o puede ocurrir que sean menor o
iguales. Si ocurre lo primero sabemos que se realizaran menos lecturas de ejes para un n determinado.
As que quedar
a acotado superiormente por el segundo caso. Para el segundo caso podemos acotar de la
siguiente forma
ttotal m
2ttotal m + m m + n
De modo que para este caso O(ttotal ) es la complejidad en base al tama
no de entrada, basandonos en la
definici
on de O grande

6.

Gr
aficos

Todos los gr
aficos son hechos en base a la cantidad de pasos y esto se realiza mediante un contador
que se va incrementando en uno por cada operacion elemental.
Este gr
afico movemos ambas variables m y n y vemos que ambos estan acotadas por dos funciones
lineales, tanto por debajo como por arriba de lo obtenido en el resultado experimental. Las rectas trazas
en las mismas, representan el mejor y el peor caso que se describio cuando se discutio el orden de
complejidad del algoritmo. Para los casos que tocan la recta inferior, podemos deducir que no hay
soluci
on para el problema debido a que en la ejecucion del algoritmo se termina antes, mientras que para
aquellos que alcanzan a tocar a la recta que acota por arriba tengo los casos que donde hay una solucion
al problema

11

Este grafico movemos los valores de m con un n fijo vemos que hasta llegar a un cierto punto,
todos ellos parecen tener una pendiente menor, mientras que pasando dicho punto, empiezan a alternar.
El punto es para cuando m alcanza n-1. Esto coincide con el hecho de que para cantidad de ejes menores
a n-1, no hay soluci
on, correspondiendo as al mejor caso del algoritmo

12

Aqu observamos que ocurre lo contrario de lo descripto anteriormente. Es decir, que a medida
que incrementamos n para un m fijo, se desfaza dicha cantidad de nodos y ocurre que empiezan a no
tener soluci
on, debido a lo referido anteriormente con respecto a la relacion necesaria para que en el
digrafo exista una soluci
on (n m). Esto explica la uniformidad hasta antes de 40

13

7.

Conclusi
on

Luego de presentar la representaci


on en grafos del problema, intrudujimos una serie de propiedades
que nos ayudaran a obtener la soluci
on final. Una de ellas consiste en el reconocimiento de componentes
fuertemente conexas, y describimos un algoritmo que resuelve este problema en tiempo lineal. Luego,
describimos otra propiedad para digrafos sin ciclos, y dicha propiedad consiste en que si queremos que
un nodo del mismo pueda recorrer al resto, el primero tiene que tener grado de entrada equivalente a
0, y debe ser el u
nico de todos los nodos que cumpla con esto. De otra manera, podemos decir que no
hay soluc
on. La complejidad final del mismo es de O(m+n) y si queremos considerarlo en funcion del
tama
no de entrada obtendramos una complejidad de... Mencionamos a uno de los algoritmos como aquel
propuesto por R.E Tarjan, del cual se detectan todas las diferentes componentes fuertemente conexas
maximales. Dicha tecnica, est
a basado en un DFS (Depth First Search) para recorrer los distintos nodos
del grafo original. Finalmente, mirando cada uno de los ejes podemos determinar la conexion que existe
entre cada componente y determinar aquel cuyo nodo del digrafo condensado tenga grado igual a 0 (y
que sea este u
nico).
Para la complejidad con respecto al tama
no de entrada, lo despejaremos de manera similar para
el primer algoritmo del torneo de tenis:
tn = log n, tm = log m, ttuplas =

m
X
i=1

ttotal = tn + tm + ttuplas
ttotal tn + tm + m
14

pi

ttotal m
Para el caso de que n m: t2total n2
De modo que resulta que la complejidad con respecto al tama
no de entrada es O(t2total )

15