Você está na página 1de 3

TEORIA DOS GRAFOS E COMPUTABILIDADE

Trabalho - Caminhos Disjuntos


Alice Cabral1 e Juliana Silvestre1
1
Instituto de Ciências Exatas e Informática –
Pontifı́cia Universidade Católica de Minas Gerais (PUCMG)
Belo Horizonte – MG – Brasil

alicecamarques@gmail.com

juliana.silvestresilva@hotmail.com

Para resolver o problema de se determinar o número máximo de caminhos disjun-


tos em arestas existentes em um grafo, foi implementado o algoritmo de Ford-Furkerson,
que recebe a quantidade de vértices de um grafo, uma matriz de adjacência que representa
o grafo, o vértice de inı́cio e o vértice de destino. A matriz de adjacência recebida pelo
algoritmo foi implementada utilizando o arquivo MatrizDirecionada.java. Esse arquivo
corresponde à implementação da matriz direcionada não ponderada realizada no trabalho
passado sobre implementação de grafos.

1. Algoritmo Ford Fulkerson


O algoritmo de Ford-Furkerson resolve o problema de se determinar o número máximo
de caminhos disjuntos em arestas existentes em um grafo, ou seja, ele resolve o problema
do fluxo máximo. Desse modo, o algoritmo implementado lista cada um dos caminhos
disjuntos encontrados e retorna a quantidade desses caminhos. Para isso, foram imple-
mentados dois métodos: run e buscaCaminho.

1.1. Método run


O método run executa o algoritmo, mostra os caminhos disjuntos encontrados e retorna
o fluxo máximo. Inicialmente, ele faz uma cópia da matriz do grafo no grafo residual
e, em seguida, é realizada a busca por um caminho até que todos os caminhos sejam
percorridos. Enquanto todos os caminhos não são percorridos, o método printa na tela
os caminhos disjuntos que vão sendo encontrados e, para isso, foi utilizado um vetor que
armazena na sua primeira posição o vértice de destino e, nas demais posições, os vértices
que correspondem ao caminho percorrido. Ainda dentro desse laço, o algoritmo percorre
o caminho e salva a aresta de menor capacidade para definir o valor do fluxo. Finalmente
os valores são atualizados no grafo residual, e o fluxo máximo é retornado.

1.2. Método buscaCaminho


Para realizar essa busca, é executado o método buscaCaminho, que faz uma busca em
largura no grafo (representado pela matriz de adjacência). A busca em largura utiliza a
estrutura de fila. Primeiramente, o vértice inicial é adicionado e,em seguida, enquanto
a fila não estiver vazia, o primeiro vértice é retirado. Nisso, é verificado se existe uma
ligação entre os vértices, se a capacidade é maior que zero e se esse vértice ainda não foi
visitado. Caso essa condição seja verdadeira, o vértice é adicionado no vetor que guarda
o caminho e no final da fila, e é marcado como visitado. Após esse laço, verifica-se se um
caminho até o destino foi formado e, se sim, o retorno é verdadeiro, e o laço no método
run continua sendo executado.

2. Classe Main e testes realizados


Na classe Main, os grafos 1, 2 e 3 (exibidos nas imagens abaixo) foram representados para
testar o algoritmo. Eles são inicializados e suas arestas são preenchidas através do método
PreencherArestas da classe MatrizDirecionada. Para cada um, os vértices de inı́cio e de
destino são armazenados em variáveis e passados por parâmetro para o algoritmo de Ford
Fulkerson, juntamente à quantidade de vértices de cada um, e à matriz de adjacência que
os representa. O fluxo máximo e os caminhos disjuntos, representados pelas arestas em
azul nas imagens, de todos os grafos foram encontrados corretamente.

GRAFO 1
Vértice de inı́cio: 0
Vértice de destino: 4
Caminhos disjuntos encontrados entre os vértices:
0-4
0-1-4
0-2-4
Quantidade de caminhos: 3

GRAFO 2
Vértice de inı́cio: 0
Vértice de destino: 5 Caminhos disjuntos encontrados entre os vértices:
0-3-5
0-4-5
0-1-2-5
Quantidade de caminhos: 3
GRAFO 3
Vértice de inı́cio: 0
Vértice de destino: 4
Caminhos disjuntos encontrados entre os vértices:
0-1-4
0-2-3-4
Quantidade de caminhos: 2

Você também pode gostar