26
CES-11 Algoritmos e Estruturas de Dados Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

  • Upload
    doquynh

  • View
    216

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

CES-11

Algoritmos e Estruturas de Dados

Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

Page 2: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

CES-11 n  Grafos

n  Conceitos gerais e representações

n  Algoritmos em grafos n  Exploração sistemática em largura

n  Caminhos mais curtos

n  Exploração sistemática em profundidade

n  Teste de aciclicidade

n  Ordenação topológica

n  Componentes fortemente conexos

n  Vértices e arestas de corte

n  Árvore geradora de custo mínimo

Page 3: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Exploração sistemática de um grafo

n  Explorar um grafo é percorrê-lo completamente, visitando todos os vértices e as arestas.

n  A ordem dessas visitas depende: n do vértice onde a exploração começa;

n da ordem de armazenamento dos vértices e das arestas na estrutura de dados.

n  Basicamente, há dois tipos de explorações: em largura e em profundidade.

Page 4: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Em largura (breadth-first search)

8

4

1

5

9

2

6

3

10

7 1

9 6

10

8

3 2

7

5

4

1

4

7

10

8

6 5 9

3

2

n  Tática: enquanto for possível, examinar todos os vértices à mesma distância do vértice corrente; quando não for mais possível, aprofundar.

n  Exemplo (supomos armazenamento em ordem crescente):

n  Uma aplicação: a exploração em largura permite encontrar, por exemplo, as distâncias e os menores caminhos entre os vértices.

Page 5: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Exploração em largura BFS(s) { desmarcar todos os vértices; int ce = 0; fila q; inicFila(q); marcar s; expl[s] = ++ce; enqueue(q,s); while (!isEmpty(q)) { curr = dequeue(q); // explorando curr for <curr,u> ∈ E { if u está desmarcado { marcar u; expl[u] = ++ce; enqueue(q,u); } } } }

Código aplicável a grafos conexos e

não orientados

Cada vértice recebe um número

de exploração (equivalente a

marcá-lo)

Page 6: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Exploração em largura

n  Durante a execução deste algoritmo, cada vértice pode ficar em três estados: n desmarcado (portanto, fora da fila): ainda não foi

atingido;

n marcado e na fila: atingido, mas não completamente explorado;

n marcado e fora da fila: já explorado.

n  Cada vértice entra na fila uma única vez, e cada aresta é visitada duas vezes. Portanto, sua complexidade de tempo é O(n+m).

Page 7: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Exemplo

D

A

E

B C

F G

H

A

B

C

D

E

F

G

H

B C

A

B H

F G

A D E

B H

C H

C H

D E F G

1 A

D E

B C

F G

H

2

4

8

5 6

3

7

não visitado

visitado D

A

E

B C

F G

H

Árvore de exploração em largura

Page 8: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Exploração em largura (digrafos)

BFS(v) { marcar v; expl[v] = ++ce; enqueue(q,v); while (!isEmpty(q)) { curr = dequeue(q); // explorando curr for <curr,u> ∈ E { if u está desmarcado { marcar u; expl[u] = ++ce; enqueue(q,u); } } } }

int ce; fila q; TravessiaBFS(s) { desmarcar todos os vértices; ce = 0; inicFila(q); BFS(s); for v ∈ V { if v está desmarcado BFS(v); } }

Código adicional

8

4

1

5

9

2

6

3

10

7 1

9 6

10

8

3 2

7

5

4

1

4

7

10

8

6 5 9

3

2 Solução também é válida para grafos

desconexos

Page 9: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

CES-11 n  Grafos

n  Conceitos gerais e representações

n  Algoritmos em grafos n  Exploração sistemática em largura

n  Caminhos mais curtos

n  Exploração sistemática em profundidade

n  Teste de aciclicidade

n  Ordenação topológica

n  Componentes fortemente conexos

n  Vértices e arestas de corte

n  Árvore geradora de custo mínimo

Page 10: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Caminhos mais curtos n  Um digrafo G=(V,E), onde V = {v1, v2, ..., vn}, é chamado de

ponderado se cada arco (vi, vj) ∈ E tem um custo cij.

n  Distância entre dois vértices é a somatória dos custos dos arcos de um caminho que os une.

n  Um problema clássico em grafos é encontrar o caminho mais curto ou a distância mínima entre dois vértices.

n  Exemplo:

A

B

C

D

F

E

G J

I

H

K

8

7

5

6 4

2 4

5

4

4

2

2 4 4

5

2 4 4 Distância mínima

entre A e K: 7+2+2+5 = 16

Page 11: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Caminhos mais curtos n  O objetivo é encontrar, a partir de um vértice de origem, os

caminhos mais curtos até os demais vértices do grafo.

n  Caminhos de 1 a 3: n  1-2-3 (custo 60)

n  1-4-3 (custo 50)

n  Caminhos de 1 a 5:

n  1-5 (custo 100)

n  1-2-3-5 (custo 70)

n  1-4-5 (custo 90)

n  1-4-3-5 (custo 60)

•  cij é o custo do vértice i até o vértice j

•  Se não houver o arco (i,j), então cij = +∞

•  O algoritmo que apresentaremos também é válido para grafos não orientados

Page 12: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Grafos com arestas de mesmo peso BFSMinCam(r) { queue q; inicFila(q); int ce = 0; for v ∈ V - {r} { d[v] = +∞; expl[v] = 0; } expl[r] = ++ce; d[r] = 0; enqueue(q,r); while (!isEmpty(q)) { u = dequeue(q); for <u,v> ∈ E { if (expl[v] == 0) { expl[v] = ++ce; d[v] = d[u] + 1; enqueue(q,v); } } } }

n  Quando todas as arestas têm pesos iguais, basta uma simples alteração na exploração em largura.

n  Afinal, os vértices vão sendo enfileirados seguindo a ordem da proximidade: portanto, basta incrementar a distância do vértice antecessor.

n  O algoritmo de Dijkstra generaliza essa ideia.

Page 13: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Exemplo do algoritmo de Dijkstra

1

2

3

4

5

6 1

2

3 5

7

7

5

1 2

4

0

1

2

3

4

5

6 1

2

3 5

7

7

5

1 2

4

0

1

5

8

8

3

1

2

3

4

5

6 1

2

3 5

7

7

5

1 2

4

0

1

5

6

3

8

1

2

3

4

5

6 1

2

3 5

7

7

5

1 2

4

0

1

5

8

3

6

+∞

+∞

+∞

+∞

+∞

+∞

1

2

3

4

5

6 1

2

3 5

7

7

5

1 2

4

0

1

+∞

+∞

7 6

8

3

0

1

1

2

3

4

5

6 1

2

3 5

7

7

5

1 2

4

3

8

6

+∞ 5

8

6

7

1

Page 14: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Algoritmo de Dijkstra (1959)

Dijkstra(u) { for v ∈ V – {u} d[v] = +∞; d[u] = 0; S ← V; \\ S contém vértices sem distância definida while S ≠ ∅ { selecionar j tal que d[j] == mini∈S{d[i]}; S ← S – {j}; \\ j passa a ter distância definida for <j,w> ∈ E, onde w ∈ S if (d[w] > d[j] + cjw) { d[w] = d[j] + cjw; pred[w] = j; } } Predecessor: permite encontrar os

vértices presentes nesse caminho

Page 15: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Passo a passo

j S d[1] d[2] d[3] d[4] d[5]

- 1,2,3,4,5 0 +∞ +∞ +∞ +∞

1 2,3,4,5 0+10=10 (1-2)

0+30=30 (1-4)

0+100=100 (1-5)

2 3,4,5 10+50=60 (1-2-3)

4 3,5 30+20=50 (1-4-3)

30+60=90 (1-4-5)

3 5 50+10=60 (1-4-3-5)

5 ∅

Calcularemos as distâncias a partir

do vértice 1

Page 16: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Complexidade de tempo

n  Grosso modo, o algoritmo de Dijkstra gasta tempo O(n2+m) = O(n2).

n  No entanto é possível melhorar essa complexidade se o conjunto S for implementado com um heap de mínimo.

n  Nesse caso, o tempo passaria a ser O((n+m).log n): n  O heap possuirá inicialmente n elementos.

n  No total, são realizadas n extrações de mínimo e m modificações de valor (será preciso manter um vetor auxiliar que armazena a posição corrente que cada vértice ocupa no heap).

Page 17: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

CES-11 n  Grafos

n  Conceitos gerais e representações

n  Algoritmos em grafos n  Exploração sistemática em largura

n  Caminhos mais curtos

n  Exploração sistemática em profundidade

n  Teste de aciclicidade

n  Ordenação topológica

n  Componentes fortemente conexos

n  Vértices e arestas de corte

n  Árvore geradora de custo mínimo

Page 18: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Em profundidade (depth-first search)

7

9

1

5

4

6

2

8

3

10 1

4 2

3

7

8 6

10

5

9

1

2

3

4

5

6 7 8

9

10

n  Tática: enquanto for possível, aprofundar-se no grafo; quando não for mais possível, recuar um nível.

n  Exemplo (supomos armazenamento em ordem crescente):

n  A exploração em profundidade possibilita respostas a várias questões. Por exemplo: ordenação topológica; se o grafo é acíclico ou conexo; quais são os seus componentes conexos e os eventuais vértices e arestas de corte.

Page 19: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Versão recursiva int ce = 0; desmarcar todos os vértices; DFS(s) { marcar s; expl[s] = ++ce; // explorando s for <s,v> ∈ E { if v está desmarcado DFS(v); } }

n  Analogamente à exploração em largura, a complexidade de tempo também é O(n+m).

n  É possível escrever esse algoritmo em versão iterativa, com o uso de uma pilha explícita.

Page 20: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Exemplo

D

A

E

B C

F G

H

A

B

C

D

E

F

G

H

B C

A

B H

F G

A D E

B H

C H

C H

D E F G

1 A

D E

B C

F G

H

2

3

4

5 6

7

8 X

X

X

X

X

X

X X

não visitado

visitado

A

B

E F

D

H

C

G

Árvore de exploração em profundidade

Page 21: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Comparação: largura x profundidade

D

A

E

BC

F G

B C

A

F

G

D

E

Árvore de exploração em profundidade

E D

A

F G

C B Árvore de exploração

em largura

Há problemas em grafos que podem ser resolvidos através de ambas explorações

Page 22: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Exploração em profundidade (digrafos)

DFS(v) { marcar v; expl[v] = ++ce; // explorando v for <v,u> ∈ E { if u está desmarcado DFS(u); } }

int ce; TravessiaDFS(s) { desmarcar todos os vértices; ce = 0; DFS(s); for v ∈ V { if v está desmarcado DFS(v); } }

Código adicional

8

4

1

5

9

2

6

3

10

7 1

9 6

10

8

3 2

7

5

4

1

4

7

10

8

6 5 9

3

2 Solução também é válida para grafos

desconexos

Page 23: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Exemplo de implementação

n  Podemos implementar ambas explorações guardando a numeração das visitas na própria estrutura de dados.

n  Exemplo:

marcado expl listaAdj CelulaAdj

vert prox

vertices Digrafo

Page 24: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Exemplo de implementação typedef int vertice; struct CelulaAdj { vertice vert; CelulaAdj *prox; }; struct CelulaVert { bool marcado; int expl; CelulaAdj *listaAdj; }; struct Digrafo { int nvert; CelulaVert *vertices; }; Digrafo G; int ce;

marcado expl listaAdj CelulaAdj

vert prox

vertices Digrafo

Page 25: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Implementação (em profundidade)

TravessiaDFS(vertice s) { vertice v; for(v=1; v<=G.nvert; v++) G.vertices[v].marcado = false; ce = 0; DFS(s); for(v=1; v<=G.nvert; v++) { if(!G.vertices[v].marcado) DFS(v); } }

marcado expl listaAdj CelulaAdj

vert prox

vertices Digrafo

Page 26: Algoritmos e Estruturas de Dados - IECalonso/ensino/CES11/ces11-cap09b.pdf · na estrutura de dados. ! Basicamente, há dois tipos de explorações: ... Grafos com arestas de mesmo

Implementação (em profundidade)

DFS(vertice s) { CelulaAdj *p; G.vertices[s].marcado = true; G.vertices[s].expl = ++ce; p = G.vertices[s].listaAdj; while (p!=NULL) { if(!G.vertices[p->vert].marcado) DFS(p->vert); p = p->prox; } }

marcado expl listaAdj CelulaAdj

vert prox

vertices Digrafo