You are on page 1of 11

Un algoritmo para matching

Penessi Cecilia

11 de noviembre de 2016

Resumen
Sea G = (V, E) un grafo no dirigido. Un matching en G es un subconjunto de aristas M ⊆ E
que no comparten vértices. Presentado este concepto, un conocido problema es el de encontrar un
matching que tenga tantas aristas como sea posible, es decir, un matching máximo. Éste problema
atrajo el interés de investigadores durante las últimas décadas, por tener un atractivo intuitivo y
diversas aplicaciones.
Nuestro objetivo es presentar y analizar un algoritmo muy interesante para el problema de
matching. Trabajaremos con grafos bipartitos porque, al ser considerablemente más simples en su
estructura, nos ayudarán a ilustrar las ideas básicas implicadas en resolver el problema general.

1. El problema de Matching
Comenzaremos introduciendo algunos conceptos básicos y estudiando ciertas propiedades de los
mismos.
Definición 1. Un grafo dirigido o digrafo es un par G = (V, A) en el cual V es un conjunto no vacı́o
y A ⊆ V × V . Los elementos en V se denominan nodos o vértices de G y los elementos en E se
denominan arcos de G.
Un grafo o grafo no dirigido es un par G = (V, E) en el cual V 6= ∅ y E ⊆ {{x, y} : x, y ∈ V }. Los
elementos en V se denominan nodos o vértices de G y los elementos en E se denominan aristas de G.
Definición 2. Un matching M de un grafo G = (V, E) es un subconjunto de E con la propiedad de
que no haya dos aristas en M que compartan un mismo vértice.
|V |
Observación 1. Un matching de un grafo G = (V, E) no puede tener más de 2 aristas.
Definición 3. Un matching M se dice:
1. máximo cuando tiene máximo cardinal entre todos los matchings de G.
2. maximal si no existe M 0 matching tal que M ⊂ M 0 y M 6= M 0 .
3. perfecto cuando su cardinal es b |V2 | c, es decir, el más grande posible en un grafo con |V | vértices.
Observación 2. Todo matching máximo es maximal, pero no todo matching maximal es máximo.
Observación 3. Todo matching perfecto es máximo y, consecuentemente, maximal.
Ejemplo 1. Si consideramos el siguiente grafo

1
podemos observar que:
 
|V |
M1 = {{v1 , v4 } , {v2 , v3 } , {v5 , v7 } , {v6 , v8 }} es un matching perfecto |M1 | = 4 = 2 y, por lo
tanto, es máximo y maximal.

M2 = {{v1 , v2 } , {v4 , v5 } , {v6 , v7 }} es un matching maximal que no es máximo pues |M2 | < |M1 |.

Definición 4. Dado un grafo G = (V, E), el problema de matching es encontrar un matching máximo.

Definición 5. Sean G = (V, E) un grafo y M un matching en G,

1. las aristas en M se dicen matcheadas o saturadas por M .

2. las aristas que no están en M se dicen libres.

3. si {u, v} es una arista saturada por M , se dice que u y v son compañeros.

4. aquellos vértices que no son incidentes en ninguna arista saturada por M se dicen expuestos, los
demás se dicen matcheados o saturados por M .

Definición 6. Un camino P = {v1 , ..., vk } se dice M − alternante si las aristas


{v1 , v2 }, {v3 , v4 }, ..., {v2j−1 , v2j }, ... son libres y las aristas {v2 , v3 }, {v4 , v5 }, ..., {v2j , v2j+1 }, ... son
matcheadas por M .
Aquellos vértices que ocupan una posición impar en un camino M − alternante que comienza con
un vértice expuesto se dicen externos, y aquellos con rango par, se dicen internos.

Ejemplo 2. Considerando el grafo del ejemplo anterior, observemos que:

M = {{v1 , v3 } , {v4 , v5 } , {v6 , v7 }} es un matching,

P = {v2 , v1 , v3 , v5 , v4 , v6 } es un camino M − alternante,

v2 y v8 son vértices expuestos,

v2 , v3 y v4 son vértices externos y v1 , v5 y v6 son internos.

Definición 7. Un camino M − alternante P = {v1 , ..., vk } se dice M − aumentante si {v1 } y {vk } son
vértices expuestos.

2
Ejemplo 3. En el grafo presentado en el Ejemplo 1, Pe = {v2 , v5 , v4 , v6 , v7 , v8 } es un camino M −
aumentante.

La importancia de los caminos aumentantes para el Problema de Matching se debe al siguiente


hecho.
Lema 1. Sea P el conjunto de aristas en un camino aumentante Q = {v1 , ..., v2k } en un grafo G con
respecto a un matching M . Entonces M 0 = M 4 P = (M ∪ P ) − (M ∩ P ) es un matching de cardinal
|M | + 1.

Demostración: Primero mostraremos que M ∆P es un matching, esto es, no hay dos aristas en
M ∆P que compartan un mismo vértice.
Supongamos, por el absurdo, que existen dos aristas e, e0 en M ∆P incidentes en un mismo vértice.
Como M ∆P = (M ∪ P ) − (M ∩ P ) = (M \ P ) ∪ (P \ M ), tenemos tres casos posibles:
1. e, e0 ∈ M \ P

2. e, e0 ∈ P \ M

3. e ∈ M \ P, e0 ∈ P \ M
En el caso 1, e, e0 ∈ M . Luego, existen al menos dos aristas en M compartiendo un mismo vértice.
Esto es una contradicción, pues M es matching por hipótesis.
Observemos que las aristas que se encuentran en el conjunto P \ M son de la forma {v2j−1 , v2j }.
Luego, no puede haber dos de ellas incidentes en un mismo vértice. Por lo tanto, el caso 2 tampoco
puede suceder.
Por último, si sucediera el caso 3, supongamos sin pérdida de generalidad que la arista e0 =
{v2j−1 , v2j } ∈ P \ M comparte el vértice v2j con e ∈ M \ P .
Además, observemos que v2j es un vértice de la arista e00 = {v2j , v2j+1 } ∈ M y luego, e y e0 son dos
aristas en M con un vértice en común. Esto es una contradicción, pues M es matching por hipótesis.
Por lo tanto, M 0 es un matching.
Ahora, analicemos |M 0 |.
P contiene 2k − 1 aristas, de las cuales k son libres ({v1 , v2 } , {v3 , v4 } , . . . , {v2k−1 , v2k }) y k − 1 son
saturadas. Luego, M 0 = M ∆P tiene |M | + 1 aristas.

Por lo tanto, dado un matching M y un camino M −aumentante, este nos servirá para conseguir
un matching de mayor cardinal.
Ejemplo 4. El camino M − aumentante Pe del Ejemplo 3 puede ser usado para conseguir el matching
M 0 = M ∆P = {{v1 , v3 } , {v2 , v5 } , {v4 , v6 } , {v7 , v8 }}.

3
|V |
Como |M 0 | = 5 = 2 , M 0 es matching máximo. Luego, no tiene sentido buscar caminos M 0 −
aumentantes en G.
El siguiente teorema constituye una caracterización de los matchings máximos.
Teorema 1. (Berge) Un matching M en un grafo G es máximo si y sólo si no existen caminos M −
aumentantes en G.

Demostración:
1. Supongamos que M es un matching máximo y que, además, existe un camino M − aumentante
en G. Luego, por el Lema anterior, existirá un matching de cardinal |M | + 1 en G. Esto es una
contradicción, pues M es matching máximo por hipótesis.

2. Ahora supongamos que M es un matching en G tal que no existen caminos M −aumentantes


en el grafo y que, además, M no es máximo, es decir, existe un matching M 0 en G tal que
|M 0 | > |M |.
Consideremos las aristas de M ∆M 0 , como M y M 0 son matchings en G, los vértices del subgrafo
G0 = (V, M ∆M 0 ) tienen grado a lo sumo 2.
Si el grado de algún vértice es 2, una de las aristas está en M y la otra, en M 0 .
Luego, todas las componentes conexas de G0 son caminos o circuitos de longitud par. En todos
los circuitos, tenemos la misma cantidad de aristas de M que de M 0 . Como |M 0 | > |M |, uno
de los caminos tiene más aristas pertenecientes a M 0 que aristas pertenecientes a M . Luego,
éste es un camino M − aumentante. Esto es una contradicción, pues no existen caminos M −
aumentantes en G por hipótesis.
Por lo tanto, de 1 y 2, queda demostrado el teorema.

2. Algoritmo para matching en un grafo “bipartito”


La idea general que utilizaremos para resolver el problema de matching será partir de cualquier
matching M (pudiendo ser este el vacı́o), descubrir repetitivamente un camino M − aumentante P y
reemplazar el matching M por M ∆P .
Definición 8. Un grafo G = (V, E) se dice bipartito si:
1. su conjunto de vértices puede ser dividido en V = V1 ∪ V2 , donde V1 y V2 son disjuntos, y

2. todas las aristas en E poseen un extremo en V1 y el otro, en V2 .


Veamos un ejemplo que nos ayude a graficar cómo organizaremos la búsqueda de caminos aumen-
tantes en un grafo bipartito G = (V, U, E) de manera sistemática y eficiente.
Sea G el grafo que se muestra en la figura,

4
consideremos el matching M = {{v1 , u2 } , {v3 , u1 } , {v4 , u3 } , {v5 , u5 }}.

Para hallar un camino M − aumentante, primero construiremos un camino M − alternante a partir


de los vértices expuestos. Como los caminos M − aumentantes deben tener un extremo en V y el otro,
en U , sin pérdida de generalidad, podemos comenzar a aumentar caminos M − alternantes solamente
desde vértices expuestos de V .
Luego, en nuestro ejemplo, comenzaremos a aumentar caminos M − alternantes desde el vértice
expuesto v2 ∈ V . Podemos buscar todos los caminos M − alternantes posibles, al mismo tiempo,
considerando todos los vértices adyacentes a v2 : u2 y u3 . Como v2 es un vértice expuesto, todas las
aristas incidentes en él son libres.
Por la definición de camino alternante, ahora debemos considerar las aristas matcheadas con ex-
tremos en u2 o u3 : {u2 , v1 } , {u3 , v4 }.
Si u2 o u3 fueran expuestos, habrı́amos descubierto un camino aumentante. Sin embargo, este no
es el caso.
Por lo tanto, agregamos los vértices v1 y v4 a nuestro conjunto de caminos aumentantes. Por nuestra
construcción, v1 y v4 son vértices externos. Luego, continuaremos construyendo caminos alternantes
desde v1 y v4 .
Notemos que el vértice u5 es alcanzado por v1 antes de la exploración de v4 . Luego, omitiremos la
arista {v4 , u5 } (estamos perdiendo sólo caminos aumentantes redundantes).
Obtenemos los nuevos vértices externos v3 y v5 y, finalmente, observemos que el vértice externo v3
es adyacente al vértice expuesto u4 .
Ası́, hemos descubierto un camino M − aumentante y, por el Lema 1, podemos obtener un matching
M 0 , el cual tendrá |M 0 | = |M | + 1 = 5 aristas. Como 5 = |V ∪U | 0
2 , el nuevo matching M es máximo.

Si miramos hacia atrás en la construcción de caminos alternantes, podemos notar que tiene una
estructura especial: las búsquedas desde niveles impares (v2 está en el nivel cero ) son triviales, pues
siempre el vértice siguiente es el compañero del vértice actual.

5
Luego, podemos simplificar esta técnica de búsqueda ignorando dichos niveles, es decir, dirigiéndo-
nos directamente de vértices externos a nuevos vértices externos. Esto corresponde a buscar un digrafo
auxiliar (V, A), donde (vi , vj ) ∈ A si y sólo si vj puede ser el vértice externo siguiente a vi en un camino
aumentante, esto es, vi es adyacente al compañero de vj .
En nuestro ejemplo:

Analicemos el algoritmo presentado en el Apéndice, el cual comparte la idea introducida en el


ejemplo anterior.
Podemos observar que este posee dos arreglos.

El arreglo mate, el cual nos indica los pares de vértices que son compañeros entre sı́ en el
matching construı́do hasta el momento, es decir, las aristas que pertenecen al mismo. Luego,
este tiene |V | + |U | entradas, donde V ∪ U son los vértices del grafo bipartito G = (V, U, E).

El arreglo expuesto, el cual nos indica si hallamos un camino aumentante, pues para v ∈ V ,
expuesto [v] = u si u es un vértice expuesto en U , adyacente a v (es decir, la arista {v, u} es
libre). Si tal vértice no existe, expuesto [v] = 0 (no podemos construir un camino aumentante a
partir de v).

Además, cuenta con otro arreglo que se utiliza para la búsqueda de un matching máximo, el arreglo
etiqueta. Si etiqueta [v] = 0 para algún v ∈ V , hemos encontrado una arista incidente en v que puede
ser agregada al matching actual. En cambio, si etiqueta [v] 6= 0, hallamos un camino aumentante
que, como ya hemos visto, puede ser utilizado para reemplazar al matching actual por otro de mayor
cardinal.
Por último, posee un procedimiento llamado aumento, el cual es el encargado de conseguir, recur-
sivamente, matchings cada vez más grandes, en el sentido de su cardinal. Si etiqueta [v] = 0, agrega
una nueva arista al matching (la arista {v, expuesto [v]}). En caso contrario, reemplaza al matching
actual utilizando el camino aumentante encontrado.
Veamos esto más claramente con el ejemplo presentado anteriormente.
Allı́, primero llamemos al procedimiento aumento(v3 ); expuesto [v3 ] = u4 entonces este cam-
biará {v3 , u1 } por {v3 , u4 }.
Luego, llamemos a aumento(v1 ) y este cambiará {v1 , u2 } por {v1 , u1 }.
Ahora, llamemos a aumento(v2 ) y será etiqueta [v2 ] = 0.
Por lo tanto, el procedimiento aumento agrega {v2 , u2 } y termina, pues hemos encontrado un
camino aumentante y, consecuentemente para este ejemplo, un matching máximo.

6
Teorema 2. El algoritmo para matching en un grafo “bipartito” G = (V, U, E) presentado, resuelve
correctamente el problema de matching en tiempo O(mı́n(|V | , |U |) × |E|).

Demostración: Observemos que el algoritmo termina si no hay caminos en el grafo auxiliar desde
un nodo expuesto de V a un vértice etiquetado. Luego, por la construcción del mismo, termina si no
existe camino aumentante en G y ası́, el presente matching es máximo.
Para analizar el tiempo destinado, observemos que un matching en G no puede poseer más de
mı́n(|V | , |U |) aristas. Luego, como cada aumento incrementa el cardinal de M en 1, tendremos a lo
sumo mı́n(|V | , |U |) pasos. A su vez, en cada uno de estos pasos debemos considerar |E| aristas. Por
lo tanto, el presente algoritmo requerirá un tiempo del orden de O(mı́n(|V | , |U |) × |E|).

Por último, veremos un ejemplo donde aplicaremos el algoritmo presentado al grafo bipartito
G = (V, U, E) que se muestra en la figura:

∀ v ∈ V ∪ U , mate [v] := 0;

1. ∀ v ∈ V , expuesto [v] := 0;
A := ∅;
mate [u] = 0 ∀ u ∈ U entonces expuesto [v1 ] := u1 , expuesto [v3 ] := u2 , expuesto [v4 ] := u3 ,
expuesto [v2 ] := u4 , expuesto [v5 ] := u3 ;
Q := ∅;
mate [v] = 0 ∀ v ∈ V entonces Q := V y etiqueta [v] := 0 ∀ v ∈ V ;
Q 6= ∅ y v1 ∈ Q entonces Q := {{v2 } , {v3 } , {v4 } , {v5 }};
expuesto [v1 ] 6= 0 entonces aplicamos aumento (v1 ) y volvemos a etapa
etiqueta [v1 ] = 0 entonces mate [v1 ] := u1 , mate [u1 ] := v1 ;

7
2. ∀ v ∈ V , expuesto [v] := 0;
A := ∅;
mate [u] = 0 ∀ u ∈ U \{u1 } entonces expuesto [v1 ] := u3 , expuesto [vu ] := u4 , expuesto [v3 ] := u2 ,
expuesto [v4 ] := u3 , expuesto [v5 ] := u3 ;
Q := ∅;
mate [v] = 0 ∀ v ∈ V \ {v1 } entonces Q := V \ {v1 } y etiqueta [v] := 0 ∀ v ∈ V \ {v1 };
Q 6= ∅ y v2 ∈ Q entonces Q := {v3 , v4 , v5 };
expuesto [v2 ] 6= 0 entonces aplicamos aumento (v2 ) y volvemos a etapa
etiqueta [v2 ] = 0 entonces mate [v2 ] := u4 , mate [u4 ] := v2 ;

3. ∀ v ∈ V , expuesto [v] := 0;
A := ∅;
mate [u] = 0 ∀ u ∈ {u2 , u3 , u5 } entonces expuesto [v1 ] := u3 , expuesto [v2 ] := u5 , expuesto [v3 ] :=
u2 , expuesto [v4 ] := u3 , expuesto [v5 ] := u3 y {v4 , u4 } ∈ E, mate [u4 ] 6= 0 y mate [u4 ] 6= v4
entonces A := {(v4 , v2 )};
Q := ∅;
mate [v] = 0 ∀ v ∈ {v3 , v4 , v5 } entonces Q := {v3 , v4 , v5 } y etiqueta [v] := 0 ∀ v ∈ {v3 , v4 , v5 };
Q 6= ∅ y v3 ∈ Q entonces Q := {v4 , v5 };
expuesto [v3 ] 6= 0 entonces aplicamos aumento (v3 ) y volvemos a etapa
etiqueta [v3 ] = 0 entonces mate [v3 ] := u2 , mate [u2 ] := v3 ;

4. ∀ v ∈ V , expuesto [v] := 0;
A := ∅;
mate [u] = 0 ∀ u ∈ {u3 , u5 } entonces expuesto [v1 ] := u3 , expuesto [v2 ] := u5 , expuesto [v3 ] := u3 ,
expuesto [v4 ] := u3 , expuesto [v5 ] := u3 ;
Q := ∅;
mate [v] = 0 ∀ v ∈ {v4 , v5 } entonces Q := {v4 , v5 } y etiqueta [v] := 0 ∀ v ∈ {v4 , v5 };
Q 6= ∅ y v4 ∈ Q entonces Q := {v5 };
expuesto [v4 ] 6= 0 entonces aplicamos aumento (v4 ) y volvemos a etapa
etiqueta [v4 ] = 0 entonces mate [v4 ] := u3 , mate [u3 ] := v4 ;

8
5. ∀ v ∈ V , expuesto [v] := 0;
A := ∅;
mate [u5 ] = 0 entonces expuesto [v2 ] := u5 y {v1 , u3 } , {v3 , u3 } , {v4 , u4 } , {v5 , u3 } ∈ E, mate [u] 6=
0 ∀ u ∈ U \{u5 } y mate [u3 ] := v4 , mate [u4 ] := v2 entonces A := {(v1 , v4 ) , (v3 , v4 ) , (v4 , v2 ) , (v5 , v4 )};
Q := ∅;
mate [v5 ] = 0 entonces Q := {v5 } y etiqueta [v5 ] := 0;
Q 6= ∅ y v5 ∈ Q entonces Q := ∅;
expuesto [v5 ] = 0 entonces etiqueta [v2 ] := v4 , etiqueta [v4 ] := v5 y Q := {v2 , v4 };
Q 6= ∅ y v2 ∈ Q entonces Q := {v4 };
expuesto [v2 ] 6= 0 entonces aplicamos aumento (v2 ) y volvemos a etapa
etiqueta [v2 ] 6= 0 entonces expuesto [v4 ] := u4 , mate [v2 ] := u5 , mate [u5 ] := v2 y aplicamos
aumento (v4 );
etiqueta [v4 ] 6= 0 entonces expuesto [v5 ] := u3 , mate [v4 ] := u4 , mate [u4 ] := v4 y aplicamos
aumento (v5 );
etiqueta [v5 ] = 0 entonces mate [v5 ] := u3 , mate [u3 ] := v5 ;

6. ∀ v ∈ V , expuesto [v] := 0;
A := ∅;
{v1 , u3 } , {v3 , u3 } , {v2 , u4 } ∈ E, mate [u] 6= 0 ∀ u ∈ U y mate [u3 ] := v4 , mate [u4 ] := v2 entonces
A := {(v1 , v5 ) , (v3 , v5 ) , (v2 , v4 )};
Q := ∅;
mate [v] 6= 0 ∀ v ∈ V entonces finalizó la aplicación del algoritmo
En el grafo auxiliar obtenido se puede observar que no existen caminos desde un nodo expuesto
de V a un vértice etiquetado.

9
Luego, conseguimos un matching máximo M = {{v1 , u1 } , {v2 , u5 } , {v3 , u2 } , {v4 , u4 } , {v5 , u3 }}
en G, con |M | = 5 = |V ∪U |
2 . Por lo tanto, además, M es perfecto.

Referencias
[1] Grimaldi R., Matemáticas Discreta y Combinatoria, una introducción con aplicaciones, 3ra ed.
Pearson Educación, 1998.

[2] Papadimitriou C., Steiglitz K., Combinatorial Optimization: Algorithms and Complexity. Prentice
Hall, 1982.

[3] West D., Introduction to Graph Theory, 2nd ed. Prentice Hall, 2001.

10
APÉNDICE: ALGORITMO PARA MATCHING EN UN GRAFO “BIPARTITO”

Entrada: Grafo bipartito G=(V,U,E)


Salida: Un matching máximo M de G, representado por el arreglo mate
inicializar
para todo v V U, mate[v]:= 0; (M =  )
etapa: inicializar
para todo v  V, expuesto[v]:= 0;
A:= ; (iniciamos la construcción del grafo auxiliar (V,A))
para todo {v,u} E
si mate[u]=0 entonces expuesto[v]:= u sino
si mate[u] v entonces A:= A (v,mate[u]);

Q:= ;
para todo v V, si mate[v]= 0 entonces Q:= Q {v} y etiqueta[v]:= 0;

mientras Q 
inicializar
sea v un nodo en Q;
remover v de Q;

si expuesto[v] 0 entonces ir a aumento(v) y volver a etapa;


sino
para todo v’ no etiquetado tal que (v,v’) A hacer
etiqueta(v’):= v, Q:= Q {v’};

fin
fin
fin
procedimiento aumento(v)
si etiqueta[v]= 0 entonces mate[v]:= expuesto[v],
mate[expuesto[v]]:= v;
sino inicializar
expuesto[etiqueta[v]]:= mate[v];
mate[v]:= expuesto[v];
mate[expuesto[v]]:= v;
aumento(etiqueta[v]);
fin

11

You might also like