• Nenhum resultado encontrado

Algoritmo Floyd-Warshall

N/A
N/A
Protected

Academic year: 2022

Share "Algoritmo Floyd-Warshall"

Copied!
31
0
0

Texto

(1)

Algoritmo Floyd-Warshall

S 21.3

Algoritmos em Grafos — 1º sem 2012 1 / 27

(2)

Problema dos caminhos mínimos entre todos os pares

Problema: Dado um digrafo com custo nos arcos, determinar, para cada par de vértices s, t o custo de um caminho mínimo de s a t

Esse problema pode ser resolvido aplicando-se V vezes o algoritmo Bellman-Ford

O consumo de tempo dessa solução é O(V2A).

Um algoritmo mais eficiente foi descrito por Floyd, baseado em uma idéia de Warshall.

O algoritmo supõe que o digrafo não tem ciclo negativo

Algoritmos em Grafos — 1º sem 2012 2 / 27

(3)

Problema dos caminhos mínimos entre todos os pares

Problema: Dado um digrafo com custo nos arcos, determinar, para cada par de vértices s, t o custo de um caminho mínimo de s a t

Esse problema pode ser resolvido aplicando-se V vezes o algoritmo Bellman-Ford

O consumo de tempo dessa solução é O(V2A).

Um algoritmo mais eficiente foi descrito por Floyd, baseado em uma idéia de Warshall.

O algoritmo supõe que o digrafo não tem ciclo negativo

Algoritmos em Grafos — 1º sem 2012 3 / 27

(4)

Problema dos caminhos mínimos entre todos os pares

Problema: Dado um digrafo com custo nos arcos, determinar, para cada par de vértices s, t o custo de um caminho mínimo de s a t

Esse problema pode ser resolvido aplicando-se V vezes o algoritmo Bellman-Ford

O consumo de tempo dessa solução é O(V2A).

Um algoritmo mais eficiente foi descrito por Floyd, baseado em uma idéia de Warshall.

O algoritmo supõe que o digrafo não tem ciclo negativo

Algoritmos em Grafos — 1º sem 2012 4 / 27

(5)

Programação dinâmica

0,1,2, . . . ,V−1 = lista dos vértices do digrafo custo[k][s][t] = menor custo de um caminho de

s a t usando vértices internos em {0,1, . . . ,k−1}

Recorrência:

custo[0][s][t] = G->adj[s][t]

custo[k][s][t] = min{custo[k-1][s][t],

custo[k-1][s][k-1] +custo[k-1][k-1][t]}

Se o digrafo não tem ciclo negativo acessível a partir de s, então custo[V][s][t] é o menor custo de um caminho simples de s a t

Algoritmos em Grafos — 1º sem 2012 5 / 27

(6)

Programação dinâmica

0,1,2, . . . ,V−1 = lista dos vértices do digrafo custo[k][s][t] = menor custo de um caminho de

s a t usando vértices internos em {0,1, . . . ,k−1}

Recorrência:

custo[0][s][t] = G->adj[s][t]

custo[k][s][t] = min{custo[k-1][s][t],

custo[k-1][s][k-1] +custo[k-1][k-1][t]}

Se o digrafo não tem ciclo negativo acessível a partir de s, então custo[V][s][t] é o menor custo de um caminho simples de s a t

Algoritmos em Grafos — 1º sem 2012 6 / 27

(7)

void floyd_warshall (Digraph G){

1 Vertex s, t; double d;

2 for (s=0; s < G->V; s++) 3 for (t=0; t < G->V; t++)

4 custo[0][s][t] = G->adj[s][t];

5 for (k=1; k <=G->V; k++) 6 for (s=0; s < G->V; s++) 7 for (t=0; t < G->V; t++){

8 custo[k][s][t]=custo[k-1][s][t];

9 d=custo[k-1][s][k-1]

+custo[k-1][k-1][t];

10 if (custo[k][s][t] > d) 11 custo[k][s][t] = d;

} }

Algoritmos em Grafos — 1º sem 2012} 7 / 27

(8)

Consumo de tempo

O consumo de tempo da função floyd_warshall1 é O(V3).

Algoritmos em Grafos — 1º sem 2012 8 / 27

(9)

void floyd_warshall (Digraph G){

1 Vertex s, t; double d;

2 for (s=0; s < G->V; s++) 3 for (t=0; t < G->V; t++)

4 cst[s][t] = G->adj[s][t];

5 for (k=1; k <= G->V; k++) 6 for (s=0; s < G->V; s++) 7 for (t=0; t < G->V; t++){

8 d=cst[s][k-1]+cst[k-1][t];

10 if (cst[s][t] > d)

11 cst[s][t] = d;

} } }

Algoritmos em Grafos — 1º sem 2012 9 / 27

(10)

Relação invariante

No início de cada iteração da linha 5 vale que cst[s][t] = custo[k][s][t] = o menor custo de um

caminho de s a t usando vértices internos em

{0,1, . . . ,k−1}

Algoritmos em Grafos — 1º sem 2012 10 / 27

(11)

Novo resumo

função consumo de observação tempo

DAGmin O(V+A) digrafos acíclicos custos arbitrários dijkstra O(AlgV) custos ≥ 0, min-heap

O(V2) custos ≥ 0, fila bellman-ford O(V3) digrafos densos O(VA) digrafos esparsos floyd-warshall O(V3) digrafos sem ciclos

negativos

O problema SPT em digrafos com ciclos negativos é NP-difícil.

Algoritmos em Grafos — 1º sem 2012 11 / 27

(12)

Árvores geradoras de grafos

Algoritmos em Grafos — 1º sem 2012 12 / 27

(13)

Subárvores

Uma subárvore de um grafo G é qualquer árvore T que seja subgrafo de G

Exemplo:

0

1 2

3 5

4 6

Algoritmos em Grafos — 1º sem 2012 13 / 27

(14)

Subárvores

Uma subárvore de um grafo G é qualquer árvore T que seja subgrafo de G

Exemplo: as arestas em vermelho formam uma subárvore

0

2 1

3 5

4 6

Algoritmos em Grafos — 1º sem 2012 14 / 27

(15)

Árvores geradoras

Uma árvore geradora (= spanning tree) de um grafo é qualquer subárvore que contenha todos os vértices

Exemplo:

0

2 1

3 5

4 6

Algoritmos em Grafos — 1º sem 2012 15 / 27

(16)

Árvores geradoras

Uma árvore geradora (= spanning tree) de um grafo é qualquer subárvore que contenha todos os vértices

Exemplo: as arestas em vermelho formam uma árvore geradora

0

2 1

3 5

4 6

Algoritmos em Grafos — 1º sem 2012 16 / 27

(17)

Árvores geradoras

Somente grafos conexos têm árvores geradoras Todo grafo conexo tem uma árvore geradora Exemplo:

0

1 2

3 5

4 6

Algoritmos em Grafos — 1º sem 2012 17 / 27

(18)

Algoritmos que calculam árvores geradoras

É fácil calcular uma árvore geradora de um grafo conexo:

a busca em profundidade e a busca em largura

fazem isso.

Qualquer das duas buscas calcula uma arborescência que contém um dos arcos de cada aresta de uma árvore geradora do grafo

Algoritmos em Grafos — 1º sem 2012 18 / 27

(19)

Primeira propriedade da troca de arestas

Seja T uma árvore geradora de um grafo G Para qualquer aresta e de G que não esteja em T, T+e tem um único ciclo não-trivial, o ciclo fundamental C(T,e).

Exemplo: T+e

0

2 1

3 5

4 6

e

Algoritmos em Grafos — 1º sem 2012 19 / 27

(20)

Primeira propriedade da troca de arestas

Seja T uma árvore geradora de um grafo G Para qualquer aresta t ∈ C(T,e), T+e-t é uma árvore geradora

Exemplo: T+e-t

0

2 1

3 5

4 6

e t

Algoritmos em Grafos — 1º sem 2012 20 / 27

(21)

Segunda propriedade da troca de arestas

Seja T uma árvore geradora de um grafo G

Para qualquer aresta t de T e qualquer aresta e que atravesse o corte determinado por T-t, o grafo T-t+e é uma árvore geradora

Exemplo: T-t

0

2 1

3 5

4 6

t

e

Algoritmos em Grafos — 1º sem 2012 21 / 27

(22)

Segunda propriedade da troca de arestas

Seja T uma árvore geradora de um grafo G

Para qualquer aresta t de T e qualquer aresta e que atravesse o corte determinado por T-t, o grafo T-t+e é uma árvore geradora

Exemplo: T-t+e

0

2 1

3 5

4 6

t

e

Algoritmos em Grafos — 1º sem 2012 22 / 27

(23)

Árvores geradoras de custo mínimo

S 20.1 e 20.2

Algoritmos em Grafos — 1º sem 2012 23 / 27

(24)

Árvores geradoras mínimas

Uma árvore geradora mínima (= minimum

spanning tree), ou MST, de um grafo com custos nas arestas é qualquer árvore geradora do grafo que

tenha custo mínimo

Exemplo: um grafo com custos nas arestas

0

1

3 5

4 6

2 5

8 10

3 2

30 16

18

14 26

4 12

Algoritmos em Grafos — 1º sem 2012 24 / 27

(25)

Árvores geradoras mínimas

Uma árvore geradora mínima (= minimum

spanning tree), ou MST, de um grafo com custos nas arestas é qualquer árvore geradora do grafo que

tenha custo mínimo

Exemplo: MST de custo 42

0

1

3 5

4 6

2 5

8 10

3 2

30 16

18

14 26

4 12

Algoritmos em Grafos — 1º sem 2012 25 / 27

(26)

Problema MST

Problema: Encontrar uma MST de um grafo G com custos nas arestas

O problema tem solução se e somente se o grafo G é conexo

Exemplo: MST de custo 42

0

1

3 5

4 6

2 5

8 10

3 2

30 16

18

14 26

4 12

Algoritmos em Grafos — 1º sem 2012 26 / 27

(27)

Propriedade dos ciclos

Condição de Otimalidade: Se T é uma MST então toda aresta e fora de T tem custo máximo dentre as arestas do único ciclo não-trivial em T+e

Exemplo: MST de custo 42

0

1

3 5

4 6

2 5

8 10

3 2

30 16

18

14 26

4 12

Algoritmos em Grafos — 1º sem 2012 27 / 27

(28)

Demonstração da recíproca

Seja T uma árvore geradora satisfazendo a condição de otimalidade.

Vamos mostrar que T é uma MST.

Seja M uma MST tal que o número de arestas comuns entre T e M seja máximo.

Se T = M não há o que demonstrar.

Suponha que T 6= M e seja e uma aresta de custo mínimo dentre as arestas que estão em M mas não estão em T.

Seja d uma aresta qualquer que não está em M mas está no ciclo fundamental C(T,e).

Algoritmos em Grafos — 1º sem 2012 28 / 27

(29)

Demonstração da recíproca

Seja T uma árvore geradora satisfazendo a condição de otimalidade.

Vamos mostrar que T é uma MST.

Seja M uma MST tal que o número de arestas comuns entre T e M seja máximo.

Se T = M não há o que demonstrar.

Suponha que T 6= M e seja e uma aresta de custo mínimo dentre as arestas que estão em M mas não estão em T.

Seja d uma aresta qualquer que não está em M mas está no ciclo fundamental C(T,e).

Algoritmos em Grafos — 1º sem 2012 29 / 27

(30)

Continuação

Logo, custo(d) ≤ custo(e) (1).

Seja f uma aresta qualquer em C(M,d)−T.

Como M é uma MST, custo(f) ≤ custo(d) (2).

Pela escolha de e, custo(e) ≤ custo(f) (3).

Juntando (1), (2) e (3), vem que

custo(d) =custo(f) =custo(e)

Mas então, M−f+d é uma MST que tem o mesmo custo que M, logo é mínima. Por outro lado, tem uma aresta a mais em comum com T do que M. Isso

contradiz a escolha de M.

Portanto, T = M, o que mostra que T é uma MST.

Algoritmos em Grafos — 1º sem 2012 30 / 27

(31)

Propriedade dos cortes

Condição de Otimalidade: T é uma MST se e

somente se cada aresta t de T é uma aresta mínima dentre as que atravessam o corte determinado por T-t

Exemplo: MST de custo 42

0

1

3 5

4 6

2 5

8 10

3 2

30 16

18

14 26

4 12

Algoritmos em Grafos — 1º sem 2012 31 / 27

Referências

Documentos relacionados

De acordo com o Instituto Ethos (2013), a GRI foi criada com o objetivo de aumentar o nível de qualidade dos relatórios de sustentabilidade. O conjunto de diretrizes e indicadores da

No algoritmo de Boruvka-Kruskal, a partir de um v´ ertice inicial arbitr´ ario, escolhe-se em cada passo uma aresta de peso o menor poss´ıvel que n˜ ao forme um ciclo com outras

(encontrar uma árvore geradora máxima), como você pode usar os algoritmos de Kruskal e Prim (sem alterá-los) para obter uma árvore. • Supondo que todas as arestas de um grafo

Nota 1.14 Pela sua rela¸ c˜ ao com o tema desta sec¸ c˜ ao, referimos aqui o conhecido “problema do Caixeiro-Viajante” que pode ser descrito como o problema de determinar, dado

Dada uma árvore não-geradora do grafo, o custo de um vértice w que está fora da árvore é o custo de uma aresta mínima dentre as que incidem em w e estão na franja da árvore..

Para grafos não direcionados, também distinguimos entre as arestas da árvore:.. – Arestas de árvore: a aresta (u,v) é uma aresta de árvore se v foi descoberto pela primeira vez ao

Algoritmo de Dijkstra: comprimentos não negativos Algoritmo de Floyd-Warshall: sem circuitos negativos. Análise de Algoritmos — 2º sem 2018 5

Algoritmo de Dijkstra: comprimentos não negativos Algoritmo de Floyd-Warshall: sem circuitos negativos... Algoritmo de Dijkstra: comprimentos não negativos Algoritmo de