Grafos: árvores geradoras mínimas
Transcript of Grafos: árvores geradoras mínimas
![Page 1: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/1.jpg)
1
Grafos: árvores geradoras mínimas
SCC0216 Modelagem Computacional em Grafos
Thiago A. S. PardoMaria Cristina F. Oliveira
![Page 2: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/2.jpg)
2
Sub-grafo
Dado um grafo G1(V1,A1), um grafo G2(V2,A2) é um sub-grafo de G1 se V2 está contido em V1 e A2 está contido em A1
os grafos em (b) e (c) são sub-grafos do grafo em (a)
![Page 3: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/3.jpg)
3
Sub-grafo geradorSub-grafo Gerador de um grafo G1(V1,A1) é um sub-grafoG2(V2,A2) de G1 tal que V1 = V2. Quando o sub-grafo gerador é uma árvore, ele recebe o nome de árvore geradora
(b) e (c) são sub-grafos geradores do grafo em (a) (c) é árvore geradora de (a) e (b)
![Page 4: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/4.jpg)
4
Sub-grafo gerador de custo mínimo
Formalmente
Dado um grafo não orientado G(V,A) em que uma função w: A→ℜ+ define os custos das
arestas queremos encontrar um sub-grafo gerador mínimo
conexo T de G tal que, para todo sub-grafo gerador conexo T´ de G
∑ ∑∈ ∈
≤Ta Ta
awaw´
)()(
![Page 5: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/5.jpg)
5
Árvore geradora mínima
Claramente, o problema só tem solução se G é conexo A partir de agora, assumimos G conexo
Também não é difícil ver que a solução para esse problema será sempre uma árvore Por que?
![Page 6: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/6.jpg)
6
Sub-grafo geradorSub-grafo Gerador de um grafo G1(V1,A1) é um sub-grafoG2(V2,A2) de G1 tal que V1 = V2. Quando o sub-grafo gerador é uma árvore, ele recebe o nome de árvore geradora
(b) e (c) são sub-grafos geradores do grafo em (a) (c) é árvore geradora de (a) e (b)
![Page 7: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/7.jpg)
7
Árvore geradora mínima
Claramente, o problema só tem solução se G é conexo A partir de agora, assumimos G conexo
Também não é difícil ver que a solução para esse problema será sempre uma árvore Basta notar que T não terá ciclos pois, caso
contrário, poderíamos obter um outro sub-grafo T´, ainda conexo e com custo menor do que o custo de T, removendo o ciclo
![Page 8: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/8.jpg)
8
Árvore geradora mínima
Árvore Geradora de um grafo G é um sub-grafo de G que contém todos os seus vértices e, ainda, é uma árvore
Arvore Geradora Mínima é a árvore geradora de um grafo valorado cuja soma dos pesos associados às arestas é mínimo, i.e., é uma árvore geradora de custo mínimo
![Page 9: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/9.jpg)
9
Árvore geradora mínima
Exemplo
?
![Page 10: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/10.jpg)
10
Árvore geradora mínima
ExemploPorque esse problema é
interessante?
![Page 11: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/11.jpg)
11
Por que é um problema interessante?
Suponha que queremos montar uma rede de distribuição de energia elétrica para interligar N localidades em uma cidade Cada conexão direta entre localidades i e j tem um custo
associado (preço do cabeamento, mão de obra, tempo, etc.) Nem todas as localidades precisam ser ligadas diretamente,
desde que todas tenham acesso à energia elétrica
Como determinar as linhas distribuição de forma a minimizar o custo total de distribuição de energia?
![Page 12: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/12.jpg)
Exercício
12
![Page 13: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/13.jpg)
Para pensar
Proponha um algoritmo para encontrar a árvore geradora mínima de um grafo
13
![Page 14: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/14.jpg)
15
Árvore geradora mínima
Como encontrar a árvore geradora mínimade um grafo G ?
Algoritmo genérico: ilustra a estratégia ‘gulosa’
Algoritmo de Prim
Algoritmo de Kruskal
![Page 15: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/15.jpg)
16
Árvore geradora mínimaAlgoritmo Genérico
G conexo, não direcionado, ponderadoA – conjunto de arestas
procedimento genérico(G)
A = ∅enquanto A não define uma árvore geradora
encontre uma aresta (u,v) segura para A
A = A ∪ {(u,v)}
retorna A
![Page 16: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/16.jpg)
17
Árvore geradora mínimaAlgoritmo Genérico
procedimento genérico(G)
A = ∅enquanto A não define uma árvore geradora
encontre uma aresta (u,v) segura para A
A = A ∪ {(u,v)}
retorna A
Abordagem ‘gulosa’ -> adiciona uma aresta (u,v) ‘segura’ a cada iteração, de modo que a árvore continue sendo uma árvore
![Page 17: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/17.jpg)
18
Árvore geradora mínimaAlgoritmo Genérico
procedimento genérico(G(V,E))
A = ∅enquanto A não define uma árvore geradora
encontre uma aresta (u,v) segura para A
A = A ∪ {(u,v)}
retorna A
Condição invariante do laço: a cada iteração, a árvore obtida até o momento é um subconjunto de uma árvore geradora mínimaaresta segura (u,v): respeita o invariante, i.e., não introduz um ciclo, e não poderia ser substituída por outra equivalente de custo menor
![Page 18: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/18.jpg)
19
Árvore geradora mínima Alguns conceitos
Um corte (V’; V - V’) de um grafo não direcionado G=(V,E) é uma partição de V
Uma aresta segura (u,v) cruza o corte se um dos vértices extremos pertence a V’ e o outro pertence a V - V’
![Page 19: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/19.jpg)
20
Árvore geradora mínima Alguns conceitos
Um corte respeita um conjunto A de arestas se nenhuma aresta em A cruza o corte
Uma aresta cruzando o corte que tenha custo mínimo em relação a todas as arestas cruzando o corte é uma aresta leve
![Page 20: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/20.jpg)
21
Árvore geradora mínima
Exemplo
Se T é uma árvore geradora mínima de um sub-grafo e há um corte (V’;V - V’) que respeita T, a aresta leve (u,v) é uma aresta segura para T
![Page 21: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/21.jpg)
22
Algoritmo de Prim
procedimento Prim(G)
escolha um vértice s para iniciar a árvoreenquanto há vértices fora da árvore
selecione uma aresta segurainsira a aresta e seu vértice na árvore
Ponto importante do algoritmo: seleção de uma aresta seguraOutro ponto: os vértices que já estão na árvore definem um corte de V
![Page 22: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/22.jpg)
23
Algoritmo de Prim
Exemplo: iniciando o algoritmo pelo vértice 0
![Page 23: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/23.jpg)
24
Algoritmo de Prim
Exemplo: iniciando o algoritmo pelo vértice 0
![Page 24: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/24.jpg)
25
Algoritmo de Prim
Exemplo: iniciando o algoritmo pelo vértice 0
![Page 25: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/25.jpg)
26
Algoritmo de Prim
![Page 26: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/26.jpg)
27
Algoritmo de Prim
Árvore geradora mínima
![Page 27: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/27.jpg)
28
Algoritmo de Prim
Há mais de uma árvore geradora mínima para um mesmo grafo
ou
![Page 28: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/28.jpg)
Exercícios
29
![Page 29: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/29.jpg)
30
Algoritmo de Prim Encontre uma árvore geradora mínima para
o grafo abaixo utilizando o algoritmo de Prim
1
2
3 4
5
6
4
10
7
1
2 1120
3
![Page 30: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/30.jpg)
31
Algoritmo de Prim
Implemente o algoritmo de Prim!
Qual a complexidade de sua implementação? Como melhorar?
![Page 31: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/31.jpg)
A grande questão é ter uma maneira eficiente de, a cada passo, achar uma aresta segura!
Os dois algoritmos (Prim e Kruskal) variam na estratégia que adotam para fazer isso! Ambos podem ser vistos como especializações
do algoritmo genérico (estratégia ‘greedy’)
32
![Page 32: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/32.jpg)
33
Algoritmo de Prim
Maneira mais eficiente de determinar a aresta segura Mantém todos os vértices que ainda não estão na
árvore em uma fila de prioridade Para cada vértice v, a prioridade é dada à aresta de
menor peso que conecta v a um vértice já na árvore(aresta leve que cruza o corte!)
![Page 33: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/33.jpg)
34
Procedure MST-PRIM(G, r)1. Cria array parent[] de tamanho |V|, inicializa com NIL2. Cria minHeap H (ou fila de prioridade) de tamanho |V|3. Insere todos os vértices em H, tal que H.key[v] é 0 para o vértice inicial
e H.key[v] é INF (infinito) para todos os demais
4. While not emptyHeap(H) do // executado |V| vezesu := extractMin(H) // operação tem custo O(log(|V|))For all v in adj(u) do // executado |A| vezes no total
If v in H then // atualiza key[v] em H: custo O(log(|V|))If w < H.key[v] then // w é o peso da aresta (u,v)
H.key[v] := wEnd Ifparent[v] := u
End IfEnd For
End While
![Page 34: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/34.jpg)
35
Procedure MST-PRIM(G, r)1. Cria array parent[] de tamanho |V|, inicializa com NIL2. Cria minHeap H (ou fila de prioridade) de tamanho |V|3. Insere todos os vértices em H, tal que H.key[r] := 0 (vértice inicial) e
H.key[v] := INF (infinito) para todos os demais
4. While not emptyHeap(H) do // executado |V| vezesu := extractMin(H) // operação tem custo O(log(|V|))For all v in adj(u) do // executado |A| vezes no total
If v in H then // atualiza key[v] em H: custo O(log(|V|))If w < H.key[v] then // w é o peso da aresta (u,v)
H.key[v] := wEnd Ifparent[v] := u
End IfEnd For
End While
![Page 35: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/35.jpg)
36
Procedure MST-PRIM(G, r)1. Cria array parent[] de tamanho |V|, inicializa com NIL2. Cria minHeap H (ou fila de prioridade) de tamanho |V|3. Insere todos os vértices em H, tal que H.key[v] é 0 para o vértice inicial
e H.key[v] é INF (infinito) para todos os demais
4. While not emptyHeap(H) do // executado |V| vezesu := extractMin(H) // operação tem custo O(log(|V|))For all v in adj(u) do // executado |A| vezes no total
If v in H then // atualiza key[v] em H: custo O(log(|V|))If w < H.key[v] then // w é o peso da aresta (u,v)
H.key[v] := wEnd Ifparent[v] := u
End IfEnd For
End While
![Page 36: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/36.jpg)
37
Algoritmo de Prim
Complexidade de tempo: O((|E| + |V|)* log(|V|)) ouO(|E| log(|V|))
Supondo representação por listas de adjacências e a fila de prioridade implementadacomo uma heap binária
![Page 37: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/37.jpg)
38
Algoritmo de Prim
Complexidade de tempo: O((|E| + |V|)* log(|V|)) ou
Supondo representação por listas de adjacências e a fila de prioridade implementadacomo uma heap binária
![Page 38: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/38.jpg)
Os dois algoritmos (Prim e Kruskal) variam na estratégia adotada para identificar uma aresta segura na iteração corrente...
39
![Page 39: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/39.jpg)
40
Algoritmo de Kruskal
Relembrando: uma floresta é um conjunto de árvores
G
![Page 40: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/40.jpg)
41
Algoritmo de Kruskal Mais eficiente do que Prim em grafos esparsos
Não precisa manter uma árvore desde o começo
Não inicia em nenhum vértice em particular
Verifica se as arestas podem (ou não) pertencer à árvore, analisando-as em ordem crescente de custo
As árvores que compõem a floresta são identificadas pelos conjuntos Si, que contém os vértices que a compõem
![Page 41: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/41.jpg)
42
Algoritmo de Kruskal
Basicamente, o algoritmo constrói uma árvore geradora a partir de uma floresta
Estado inicial: corresponde à floresta formada por |V| árvores triviais (i.e., um só vértice cada)
![Page 42: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/42.jpg)
43
Algoritmo de Kruskal
procedimento Kruskal(G)
definir conjuntos Sj = {vj}, 1 ≤ j ≤ |V|inserir as arestas de G em uma fila de prioridade,
em ordem crescente de pesoenquanto houver arestas na fila faça
(v,w) = remove aresta da filase v ∈ Sp e w ∈ Sq, Sp∩Sq = ∅ entãoSp = Sp∪Sqeliminar Sq
Ponto importante do algoritmo: deve-se evitar ciclos!
![Page 43: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/43.jpg)
44
Algoritmo de Kruskal
procedimento Kruskal(G)
definir conjuntos Sj = {vj}, 1 ≤ j ≤ |V|inserir as arestas de G em uma fila de prioridade,
em ordem crescente de pesoenquanto houver arestas na fila faça
(v,w) = remove aresta da filase v ∈ Sp e w ∈ Sq, Sp∩Sq = ∅ entãoSp = Sp∪Sqeliminar Sq
Ponto importante do algoritmo: deve-se evitar ciclos! Por que?
![Page 44: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/44.jpg)
45
Algoritmo de Kruskal
procedimento Kruskal(G)
definir conjuntos Sj = {vj}, 1 ≤ j ≤ |V|inserir as arestas de G em uma fila de prioridade,
em ordem crescente de pesoenquanto houver arestas na fila faça
(v,w) = remove aresta da filase v ∈ Sp e w ∈ Sq, Sp∩Sq = ∅ entãoSp = Sp∪Sqeliminar Sq
Ponto importante do algoritmo: deve-se evitar ciclos! Onde está isso?
![Page 45: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/45.jpg)
46
Algoritmo de Kruskal
Exemplo
Fila: (0,2) (1,2) (2,3) (4,5) (3,5) (2,5) (1,4) (0,3) (0,1)
![Page 46: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/46.jpg)
47
Algoritmo de Kruskal: exemplo
![Page 47: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/47.jpg)
Algoritmo de Kruskal: exemplo
![Page 48: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/48.jpg)
49
Algoritmo de Kruskal: exemplo
![Page 49: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/49.jpg)
50
Algoritmo de Kruskal: exemplo
![Page 50: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/50.jpg)
51
Algoritmo de Kruskal: exemplo
![Page 51: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/51.jpg)
52
Algoritmo de Kruskal: exemplo
![Page 52: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/52.jpg)
53
Algoritmo de Kruskal Exercício
Encontre uma árvore geradora mínima para o grafo abaixo utilizando o algoritmo de Kruskal
1
2
3 4
5
6
4
10
7
1
2 1120
3
![Page 53: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/53.jpg)
Algoritmo de Kruskal: exemplo
Exercício
Implementação do algoritmo de Kruskal
54
![Page 54: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/54.jpg)
55
Procedure MST-Kruskal(G)
1. A := ∅2. For each vertex v in V do
make-set(v)End For
3. Ordenar arestas de E em ordem crescente de peso w4. For each (u,v) in E (em ordem crescente de peso) do
If find-set(u) ≠ find-set(v) thenA := A ∪ {(u,v)} union(u,v)
End IfEnd For
make-set(u): cria conjunto com vértice ufind-set(u): retorna um elemento representativo do conjunto que contém uunion(u,v): combina as árvores
![Page 55: Grafos: árvores geradoras mínimas](https://reader031.fdocument.pub/reader031/viewer/2022012503/617d77c96f38ef14377c886d/html5/thumbnails/55.jpg)
Algoritmo de Kruskal
Complexidade: O(|E| log(|V|))
Se bem implementado (depende da estrutura de dados adotada para representar os conjuntos!) discussão no livro do Cormen, cap. 23
56