25

@let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

Melhores momentos

AULA 6

Page 2: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

Busca DFS (CLRS)

Vamos supor que nossos digrafos têm no máximomaxV vértices

#de�ne maxV 10000static int time, parnt[maxV], d[maxV],f[maxV];

DIGRAPHdfs visita todos os vértices e arcos dodigrafo G.A função registra em d[v] o 'momento' em que v foidescoberto e em f[v] o momento em que ele foicompletamente examinado

Page 3: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

Busca DFS (CLRS)

0

2

1

645

7

3

[2,5] [6,7]

[3,4]

[0,9]

[1,8]

[10,15]

[11,12] [13,14]

Page 4: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

DIGRAPHdfs

void DIGRAPHdfs (Digraph G) {Vertex v;

1 time = 0;2 for (v = 0; v < G�>V; v++) {3 d[v] = f[v] = -1;

4 parnt[v] = -1;

5 }6 for (v= 0; v < G�>V; v++)7 if (d[v] == -1) {8 parnt[v] = v;

9 dfsR(G, v),}

}

Page 5: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

dfsR

void dfsR (Digraph G, Vertex v) {link p;

Vertex w;

1 d[v] = time++;2 for (p = G�>adj[v]; p != NULL; p= p�>next)3 w = p�>w;

4 if (d[w] == -1) {5 parnt[w] = v;

6 dfsR(G, w);7 }8 f[v] = time++;}

Page 6: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

Classi�cação dos arcos

0

2

1

645

7

3

[2,5] [6,7]

[3,4]

[0,9]

[1,8]

[10,15]

[11,12] [13,14]

Page 7: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

Arcos de arborescência ou descendentesv-w é arco de arborescência ou descendente see somente se d[v] < d[w] < f[w] < f[v]

0

2

1

645

7

3

[2,5] [6,7]

[3,4]

[0,9]

[1,8]

[10,15]

[11,12] [13,14]

Page 8: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

Arcos de retornov-w é arco de retorno se e somente se

d[w] < d[v] < f[v] < f[w]

0

2

1

645

7

3

[2,5] [6,7]

[3,4]

[0,9]

[1,8]

[10,15]

[11,12] [13,14]

Page 9: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

Arcos cruzadosv-w é arco cruzado se e somente se

d[w] < f[w] < d[v] < f[v]

0

2

1

645

7

3

[2,5] [6,7]

[3,4]

[0,9]

[1,8]

[10,15]

[11,12] [13,14]

Page 10: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

Conclusões

v-w é:

I arco de arborescência se e somente sed[v] < d[w] < f[w] < f[v] e parnt[w] = v;

I arco descendente se e somente sed[v] < d[w] < f[w] < f[v] e parnt[w] 6= v;

I arco de retorno se e somente sed[w] < d[v] < f[v] < f[w];

I arco cruzado se e somente sed[w] < f[w] < d[v] < f[v];

Page 11: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

AULA 7

Page 12: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

Ciclos em digrafos

Page 13: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

CiclosUm ciclo num digrafo é qualquer seqüência da formav0�v1�v2�...�vk−1�vp, onde vk−1-vk é um arco parak = 1, . . . , p e v0 = vp.

Exemplo: 2-1-5-3-4-2 é um ciclo

0

12

3 5

4

Page 14: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

Procurando um ciclo

Problema: decidir se dado digrafo G possui um ciclo

Exemplo: para o grafo a seguir a resposta é SIM

0

12

3 5

4

Page 15: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

Procurando um ciclo

Problema: decidir se dado digrafo G possui um ciclo

Exemplo: para o grafo a seguir a resposta é SIM

0

12

3 5

4

Page 16: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

Procurando um ciclo

Problema: decidir se dado digrafo G possui um ciclo

Exemplo: para o grafo a seguir a resposta é NÃO

0

12

3 5

4

Page 17: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

DIGRAPHcycle1

Recebe um digrafo G e devolve 1 se existe um cicloem G e devolve 0 em caso contrárioSupõe que o digrafo tem no máximo maxV vértices.

int DIGRAPHcycle1 (Digraph G);

Page 18: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

Primeiro algoritmo

int DIGRAPHcycle1 (Digraph G) {Vertex v;

link p;

int output;1 for (v = 0; v < G�>V; v++)2 for (p=G->adj[v];p!= NULL;p=p->next)

{3 output = DIGRAPHpath(G, p�>w, v);4 if (output == 1) return 1;

}5 return 0;}

Page 19: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

Consumo de tempo

O consumo de tempo da função DIGRAPHcycle1

é A vezes o consumo de tempo da funçãoDIGRAPHpath.

O consumo de tempo da função DIGRAPHcycle1

para vetor de listas de adjacência é O(A(V+ A)).

O consumo de tempo da função DIGRAPHcicle1

para matriz de adjacência é O(AV2).

Page 20: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

DIGRAPHcycle

Vamos supor que nossos digrafos têm no máximomaxV vértices

#de�ne maxV 10000static int time, d[maxV], f[maxV];static Vertex parnt[maxV];

Page 21: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

DIGRAPHcycle

Recebe um digrafo G e devolve 1 se existe um cicloem G e devolve 0 em caso contrário

int DIGRAPHcycle (Digraph G);

A função tem por base a seguinte observação: emrelação a qualquer �oresta de busca emprofundidade,

todo arco de retorno pertence a um ciclo e

todo ciclo tem um arco de retorno

Page 22: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

Arcos de retornov-w é arco de retorno se e somente se

d[w] < d[v] < f[v] < f[w]

0

2

1

645

7

3

[2,5] [6,7]

[3,4]

[0,9]

[1,8]

[10,15]

[11,12] [13,14]

Page 23: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

DIGRAPHcycle

int DIGRAPHcycle (Digraph G) {Vertex v;

1 time = 0;2 for (v = 0; v < G�>V; v++) {3 d[v] = f[v] = -1; parnt[v] = -1;

4 }5 for (v= 0; v < G�>V,v++)6 if (d[v] == -1) {7 parnt[v] = v;

8 if (cycleR(G,v) == 1) return 1;}

9 return 0;}

Page 24: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

cycleR

int cycleR (Digraph G, Vertex v) {link p; Vertex w;

1 d[v] = time++;2 for (p = G�>adj[v]; p != NULL; p= p�>next)3 w= p�>w;

4 if (d[w] == -1) {4 parnt[w] = v;

5 if (cycleR(G,w)==1) return 1;}

6 else if (f[w] == -1) return 1;7 f[v] = time++;8 return 0;}

Page 25: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula07.pdf · 2011. 3. 30. · AULA 6. Busca DFS (CLRS) Vamos supor que nossos digrafos têm no máximo maxV vértices

Consumo de tempo

O consumo de tempo da função DIGRAPHcycle

para vetor de listas de adjacência é O(V+ A).

O consumo de tempo da função DIGRAPHcycle

para matriz de adjacência é O(V2).