Você está na página 1de 20

Algoritmos em Grafos

Adaptado: Fernando Moraes de Oliveira


PARTE 8:
Caminho Mínimo e Árvore Geradora Mínima

Algoritmos em Grafos 2
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo – Algoritmo de Bellman-Ford

Um outro algoritmo para encontrar os caminhos mínimos a partir


de um único nó para todos os outros em um grafo é o Algoritmo de
Bellman-Ford.

Ao contrário do algoritmo de Dijkstra, que guarda um conjunto de


nós cujas distâncias mínimas de comprimento arbitrário (isto é,
número de arcos) já foram determinadas, o algoritmo de Bellman-
Ford executa uma série de cálculos procurando encontrar
caminhos mínimos, sucessivamente, de comprimento 1, 2, 3, e
assim por diante, até ao máximo comprimento N-1 (se existir
algum caminho, então existirá um de comprimento menor ou igual
a N-1).

Este tipo de algoritmo, suporta arestas negativas. Porém, não pode


haver ciclos negativos a partir da origem.

Algoritmos em Grafos 3
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo – Algoritmo de Bellman-Ford

Vejam o Pseudocódigo
Algoritmo Ford;

//A é uma matriz de adjacências modificada de um grafo simples e


conexo com pesos;
//X é um nó no grafo;
//Quando o algoritmo terminar, os nós do caminho mínimo de X
para um nó Y serão, Y, s[y], s[s[y]], ..., X;
//A distância correspondente é d[y]

Var
z,p //nós temporários
t: array de inteiros //vetor de distâncias temporário

Algoritmos em Grafos 4
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo – Algoritmo de Bellman-Ford

Vejam o Pseudocódigo (continuação)


// Inicializa os vetores d e s. Isso estabelece os caminhos mínimos
de comprimento 1 a partir de X.
D[x] = 0

Para todos os nós Z diferentes de X faça


D[z] = A[x, z]
S[z] = X
FimPara

Algoritmos em Grafos 5
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo – Algoritmo de Bellman-Ford

Vejam o Pseudocódigo (continuação)


//Encontra os caminhos mínimos de comprimentos 2, 3, etc...
Para i = 2 até n-1 faça
t=d //copia vetor atual d no vetor t
//Modifica t para guardar os menores caminhos de
comprimento i
Para todos os nós Z diferentes de X faça
//encontra o caminho mínimo com mais um arco
p= nó em G para o qual (d[p] + A[p,z]) é mínimo
t[z] = d[p] + A[p, z]
Se p diferente de Z então
s[z] = p
Fimse
FimPara
d=t //copia o vetor t de volta em d
Fim Para
Fim. Algoritmos em Grafos 6
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo – Algoritmo de Bellman-Ford

Exemplo para o Algoritmo de Bellman-Ford


Matriz de Adjacências modificada
2
2 3 1 2 3 4 5 6 7 8
1
3 1 ∞ 3 5 ∞ 8 1 ∞ ∞
5
2 2 3 ∞ 2 ∞ ∞ ∞ 1 ∞
1 1 4
1 3 5 2 ∞ 1 ∞ ∞ ∞ 2
7 8
4 ∞ ∞ 1 ∞ 4 ∞ ∞ ∞
5 1
1 8 4 5 8 ∞ ∞ 4 ∞ 6 ∞ 1
6 5 6 1 ∞ ∞ ∞ 6 ∞ 5 ∞
6 7 ∞ 1 ∞ ∞ ∞ 5 ∞ 1
8 ∞ ∞ 2 ∞ 1 ∞ 1 ∞

Algoritmos em Grafos 7
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo – Algoritmo de Bellman-Ford


Exemplo para o Algoritmo de Bellman-Ford

1 2 3 4 5 6 7 8
D 3 0 2 ∞ ∞ ∞ 1 ∞
s 2 - 2 2 2 2 2 2
2
2 3
3 1
5
2
1 1 4
1
7 8
5 1
1 8 4

6 5
6
Algoritmos em Grafos 8
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo – Algoritmo de Bellman-Ford


Exemplo para o Algoritmo de Bellman-Ford

1 2 3 4 5 6 7 8
D 3 0 2 3 ∞ ∞ 1 ∞
s 2 - 2 3 2 2 2 2
2
2 3
3 1
5
2
1 1 4
1
7 8
5 1
1 8 4

6 5
6
Algoritmos em Grafos 9
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo – Algoritmo de Bellman-Ford


Exemplo para o Algoritmo de Bellman-Ford

1 2 3 4 5 6 7 8
D 3 0 2 3 ∞ ∞ 1 2
s 2 - 2 3 2 2 2 7
2
2 3
3 1
5
2
1 1 4
1
7 8
5 1
1 8 4

6 5
6
Algoritmos em Grafos 10
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo – Algoritmo de Bellman-Ford


Exemplo para o Algoritmo de Bellman-Ford

1 2 3 4 5 6 7 8
D 3 0 2 3 11 ∞ 1 2
s 2 - 2 3 1 2 2 7
2
2 3
3 1
5
2
1 1 4
1
7 8
5 1
1 8 4

6 5
6
Algoritmos em Grafos 11
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo – Algoritmo de Bellman-Ford


Exemplo para o Algoritmo de Bellman-Ford

1 2 3 4 5 6 7 8
D 3 0 2 3 11 ∞ 1 2
s 2 - 2 3 1 2 2 7
2
2 3
3 1
5
2
1 1 4
1
7 8
5 1
1 8 4

6 5
6
Algoritmos em Grafos 12
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo – Algoritmo de Bellman-Ford


Exemplo para o Algoritmo de Bellman-Ford

1 2 3 4 5 6 7 8
D 3 0 2 3 11 4 1 2
s 2 - 2 3 1 1 2 7
2
2 3
3 1
5
2
1 1 4
1
7 8
5 1
1 8 4

6 5
6
Algoritmos em Grafos 13
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo – Algoritmo de Bellman-Ford


Exemplo para o Algoritmo de Bellman-Ford

1 2 3 4 5 6 7 8
D 3 0 2 3 3 4 1 2
s 2 - 2 3 8 1 2 7
2
2 3
3 1
5
2
1 1 4
1
7 8
5 1
1 8 4

6 5
6
Algoritmos em Grafos 14
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Árvore Geradora Mínima – Algoritmo de Floyd

Para calcular a distância correspondente ao caminho mínimo entre


dois nós quaisquer em um grafo, o algoritmo de Dijkstra poderia
ser usado repetidamente, com cada um dos nós sendo o nó fonte.

Um algoritmo diferente, muito semelhante ao algoritmo de


Warshall, também pode ser usado para resolver esse problema de
caminho mínimo “entre todos os pares”.

Ele é chamado de Algoritmo de Floyd.

A complexidade dele, assim como o Algoritmo de Warshall, é O(n3),


como podem verificar a seguir.

Algoritmos em Grafos 15
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo – Algoritmo de Floyd

Vejam o Pseudocódigo

Algoritmo de Floyd;

//Calcula o caminho mínimo entre dois nós quaisquer.


//Inicialmente, A é uma matriz de adjacência.
// Ao final, A vai conter todas as distâncias dos caminhos mínimos.

Para k=1 até n faça


Para i = 1 até n faça
Para j = 1 até n faça
Se A[i,k] + A[k,j] < A [i,j] então
A [i,j] = A[i,k] + A [k,j]
FimSe
FimPara
FimPara
FimPara
Fim. Algoritmos em Grafos 16
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo – Algoritmo de Floyd

Exemplo para o Algoritmo de Floyd

x
4 1 Matriz de Adjacências modificada
1 x 1 2 3 y
3 1
X 0 1 ∞ 4 ∞
5
2 3 1 1 0 3 1 5
2 ∞ 3 0 2 2
3 2
3 4 1 2 0 3
Y 2 y ∞ 5 2 3 0

Matriz A inicial e depois de K = x

Algoritmos em Grafos 17
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo – Algoritmo de Floyd

Exemplo para o Algoritmo de Floyd

x
4 1 Matriz de Adjacências modificada
1 x 1 2 3 y
3 1
X 0 1 4 2 6
5
2 3 1 1 0 3 1 5
2 4 3 0 2 2
3 2
3 2 1 2 0 3
Y 2 y 6 5 2 3 0

Depois de K = 1 e K = 2

Algoritmos em Grafos 18
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo – Algoritmo de Floyd

Exemplo para o Algoritmo de Floyd

x
4 1 Matriz de Adjacências modificada
1 x 1 2 3 y
3 1
X 0 1 4 2 6
5
2 3 1 1 0 3 1 5
2 4 3 0 2 2
3 2
3 2 1 2 0 3
Y 2 y 6 5 2 3 0

Depois de K = 3 e K = Y

Algoritmos em Grafos 19
Caminho mínimo e Árvore Geradora Mínima

• Grafos – Caminho mínimo

TRABALHO IV para P2 – 3,0 pontos

a) Implemente o algoritmo de Bellman-Ford em C, Pascal ou Python.

b) Implemente o algoritmo de Floyd em C, Pascal ou Python.

c) Pesquisa sobre o Algoritmo de Johnson


- Faça uma dissertação sobre ele (para quais tipos de grafos ele
serve, qual é a ordem de complexidade dele, etc...
- Desenvolva um pseudocódigo para ele (não vale copiar).
- Faça um versus entre ele e o Algoritmo de Floyd (diferenças
básicas).

P.S. Envie os arquivos anexando-os separadamente. (Ex: letraA.py , letraB.py e letraC.pdf)

DATA LIMITE DE ENTREGA: 20/11/2011 POR EMAIL.

Grupo até 5 pessoas

Algoritmos em Grafos 20

Você também pode gostar