Problema do emparelhamento máximo em grafos bipartidos (maximum bipartite matching) Problema do emparelhamento máximo em grafos bipartidos (maximum bipartite matching) 1. Um emparelhamento em um grafo não dirigido G=(V,E) (graph matching, correspondência) é um subconjunto E´ ´. E de arestas de G, tal que cada vértice de V incide em no máximo uma aresta de E 2. Por exemplo: Considere o seguinte problema: imagine que você tenha um conjunto de pessoas e queira separar um conjunto de pares de pessoas que se conhecem. O problema pode ser modelado como um grafo em que as pessoas são os vértices, e (u,v) é uma aresta do grafo se u e v se conhecem (par não orientado, grafo não dirigido). Neste caso, um conjunto de pares que se conhecem é um matching: cada par é uma aresta (pessoas que se conhecem), e cada pessoa só pode estar em um par no matching, isto é, cada vértice só pode ser incidente a uma aresta. 3. O problema do emparelhamento máximo em um grafo não dirigido consiste simplesmente em encontrar "um" emparelhamento no grafo que tenha o maior número de arestas possível (porque "um" e não "o"?). Você acha fácil fazer um algoritmo para isto? Bem, depende: é relativamente fácil fazer um algoritmo se você já sabe como explorar análise combinatória em algoritmos. Mas este algoritmo vai "provavelmente" ter um tempo de execução superpolinomial: a análise de pior caso vai mostrar que o pior caso do algoritmo ingênuo é de alguma classe que não é polinomial. Existem no entanto algoritmos polinomiais para graph matching, em particular o "Blossom Algorithm" de Jack Edmonds, que é bastante complicado, e executa em tempo O(|V|^4). Há outros algoritmos um pouco mais eficientes. Neste momento discutiremos apenas um caso especial do problema do emparelhamento máximo em um tipo particular de grafo chamado grafo bipartido, que tem enorme aplicação prática, e que tem conexão com fluxos. 4. Um grafo não dirigido G=(V,E) é dito bipartido(bipartite graph), se for possível encontrar um corte (S, V-S) em G tal que todas as arestas de V (isto é, de E) cruzam o corte. 1. Um corte (S, V-S) é simplesmente umapartição de V em dois subconjuntos S, T (pela definição de partição, S e T devem ser disjuntos e a união de S e T é o próprio V; desta forma, ao invés de S, T,mais simples expressar como S e V-S. 2. Uma aresta (u,v) cruza um corte (S, V-S), se u está de um lado e v do outro, isto é: e ou vice-versa. 3. As noções acima também se aplicam a grafos dirigidos. Um grafo dirigido bipartido tem a partição definida implicitamente pelas arestas: um dos conjuntos é o dos vértices que tem arcos saindo e outro é o dos que tem arcos chegando (mostre que se houver algum vértice no grafo dirigido que tem simultaneamente grau de entrada e de saída maior que 0, o grafo não pode ser bipartido) 5. Exemplos de grafos bipartite: 1. Um exemplo típico é o de tarefas e máquinas: uma tarefa pode ser executável por mais de uma máquina; uma máquina pode ser capaz de executar diversos tipos de tarefas. Se as arestas conectam uma tarefa e uma máquina sse a tarefa pode ser executada pela máquina, então o grafo é bipartite. 2. Outro exemplo, um pouco mais criativo: V é um conjunto de íons, e E é um conjunto de ligações iônicas entre eles. Um íon pode estar ligado com 0 ou mais outros íons, mas seguramente existe um corte em que de um lado estão os cátions e de outro os ânions, e as ligações iônicas, todas são formadas por pares que estão em lados opostos. 6. O problema do emparelhamento máximo em grafo bipartido consiste em dado um grafo bipartido G, encontrar um emparelhamento máximo em G. Este problema pode ser facilmente resolvido,reduzindoo ao problema de fluxo máximo (o conceito de redução entre problemas é muito importante em algoritmos e em teoria da computação e será melhor estudado ao longo do curso; este é um exemplo). 1. Primeiro verifique que, se G=(V, E) é bipartido, é fácil construir um algoritmo que acha a partição (S, V-S) 2. Constrói-se uma rede de fluxo consistindo de um grafo dirigido G´=(V´, E´) com capacidades c (u,v), fonte s e dreno t assim: 1. V´ = V U {s,t}, onde s e t são novos vértices, que não estão em V 2. Para toda aresta , assumindo, sem perda de generalidade (w.l.o.g. = without loss of generality), que e , insere-se (u,v) em E´ (note que estas arestas são apenas versões dirigidas das arestas de E) 3. Para cada vértice insere (s, u) em E´ 4. Para cada vértice insere (v, t) em E´ 5. Para toda aresta (u,v) de E´, faz c(u,v) = 1 (todas as capacidades são unitárias) 3. Neste caso, o tamanho do maior emparelhamento em G é igual ao valor do fluxo máximo na rede de G´. E o emparelhamento buscado é o conjunto de pares (u,v) tal que f(u,v) =1, onde f é o fluxo máximo encontrado. 4. Este processo pode ser implementado em O (VE), porque capacidades integrais é e fluxo máximo com