estruturas discretas caminhamento em grafos: busca em largura e busca em profundidade
TRANSCRIPT
![Page 1: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/1.jpg)
Estruturas Discretas
Caminhamento em Grafos: Busca em Largura e Busca em
Profundidade
![Page 2: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/2.jpg)
Estruturas Discretas
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s) 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
Busca em Largura
Notação
• Adj[u] : lista dos vértices adjacentes a u em alguma ordem• Dequeue(S): Remove o primeiro elemento da fila S• Enqueue (S,v) : Adiciona o nó v na fila S
![Page 3: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/3.jpg)
Estruturas Discretas
Exemplo
12
34
57
6
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
S
![Page 4: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/4.jpg)
Estruturas Discretas
Exemplo
12
34
57
6
1
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
S
![Page 5: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/5.jpg)
Estruturas Discretas
12
34
57
6
Exemplo
S
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
![Page 6: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/6.jpg)
Estruturas Discretas
Exemplo
12
34
57
6
4S
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
![Page 7: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/7.jpg)
Estruturas Discretas
Exemplo
12
34
57
6
4 5S
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
![Page 8: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/8.jpg)
Estruturas Discretas
Exemplo
12
34
57
6
4 5 2S
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
![Page 9: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/9.jpg)
Estruturas Discretas
Exemplo
12
34
57
6
5 2S
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
![Page 10: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/10.jpg)
Estruturas Discretas
Exemplo
12
34
57
6
5 2S
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
![Page 11: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/11.jpg)
Estruturas Discretas
Exemplo
12
34
57
6
5 2S
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
![Page 12: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/12.jpg)
Estruturas Discretas
Exemplo
12
34
57
6
2S
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
![Page 13: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/13.jpg)
Estruturas Discretas
12
34
57
6
Exemplo
S
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
![Page 14: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/14.jpg)
Estruturas Discretas
Exemplo
12
34
57
6
6S
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
![Page 15: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/15.jpg)
Estruturas Discretas
Exemplo
12
34
57
6
S
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
![Page 16: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/16.jpg)
Estruturas Discretas
12
34
57
6
3
Exemplo
S
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
![Page 17: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/17.jpg)
Estruturas Discretas
12
34
57
6
3
Exemplo
S
3
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
![Page 18: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/18.jpg)
Estruturas Discretas
12
34
57
6
Exemplo
S
3
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
![Page 19: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/19.jpg)
Estruturas Discretas
Exemplo
12
34
57
6
S
BFS(G)
1 for every vertex s of G not explored yet2 do Enqueue(S,s); 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 mark edge (v,u) as tree edge9 mark vertex v as visited10 Enqueue(S,v)
7
![Page 20: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/20.jpg)
Estruturas Discretas
Distâncias da origem aos demais vértices
BFS(G)
1 For each v do d[v]infinito (inicia o vetor d)2 Enqueue(S,s) ; d[s]0 3 mark vertex s as visited4 while S is not empty do5 u ← Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then8 d[v]d[u]+1 (atualiza o valor de d[v])9 mark edge (v,u) as tree edge10 mark vertex v as visited11 Enqueue(S,v)
• Assumimos que o grafo é conexo
• Ao término da execução d[v] guarda a distância entre a origem s e o vértice v
![Page 21: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/21.jpg)
Estruturas Discretas
Propriedades da Busca em Largura
Teorema: A BFS visita os vértices em ordem crescente de distâncias
Teorema: Para toda aresta (v, w) em G tal que v Li e w L
j, |i – j| ≤ 1.
L0
L1
L2
L3
L4
![Page 22: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/22.jpg)
Estruturas Discretas
Busca em Profundidade
12
34
57
6
DFS(G)1 Para todo v em G2 Se v não visitado então 3 DFS-Visit(G, v)
DFS-Visit(G, v)1 Marque v como visitado2 Para todo w em Adj(v)3 Se w não visitado então 4 Insira aresta (v, w) na árvore5 DFS-Visit(G, w)
![Page 23: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/23.jpg)
Estruturas Discretas
Busca em Profundidade : Exemplo
12
34
57
6
DFS(G)1 Para todo v em G2 Se v não visitado então 3 DFS-Visit(G, v)
DFS-Visit(G, v)1 Marque v como visitado2 Para todo w em Adj(v)3 Se w não visitado então 4 Insira aresta (v, w) na árvore5 DFS-Visit(G, w)
![Page 24: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/24.jpg)
Estruturas Discretas
Busca em Profundidade : Exemplo
12
34
57
6
DFS(G)1 Para todo v em G2 Se v não visitado então 3 DFS-Visit(G, v)
DFS-Visit(G, v)1 Marque v como visitado2 Para todo w em Adj(v)3 Se w não visitado então 4 Insira aresta (v, w) na árvore5 DFS-Visit(G, w)
![Page 25: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/25.jpg)
Estruturas Discretas
Busca em Profundidade : Exemplo
12
34
57
6
DFS(G)1 Para todo v em G2 Se v não visitado então 3 DFS-Visit(G, v)
DFS-Visit(G, v)1 Marque v como visitado2 Para todo w em Adj(v)3 Se w não visitado então 4 Insira aresta (v, w) na árvore5 DFS-Visit(G, w)
![Page 26: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/26.jpg)
Estruturas Discretas
Busca em Profundidade : Exemplo
12
34
57
6
DFS(G)1 Para todo v em G2 Se v não visitado então 3 DFS-Visit(G, v)
DFS-Visit(G, v)1 Marque v como visitado2 Para todo w em Adj(v)3 Se w não visitado então 4 Insira aresta (v, w) na árvore5 DFS-Visit(G, w)
![Page 27: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/27.jpg)
Estruturas Discretas
Busca em Profundidade : Exemplo
12
34
57
6
DFS(G)1 Para todo v em G2 Se v não visitado então 3 DFS-Visit(G, v)
DFS-Visit(G, v)1 Marque v como visitado2 Para todo w em Adj(v)3 Se w não visitado então 4 Insira aresta (v, w) na árvore5 DFS-Visit(G, w)
![Page 28: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/28.jpg)
Estruturas Discretas
Busca em Profundidade : Exemplo
12
34
57
6
DFS(G)1 Para todo v em G2 Se v não visitado então 3 DFS-Visit(G, v)
DFS-Visit(G, v)1 Marque v como visitado2 Para todo w em Adj(v)3 Se w não visitado então 4 Insira aresta (v, w) na árvore5 DFS-Visit(G, w)
![Page 29: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/29.jpg)
Estruturas Discretas
Busca em Profundidade : Exemplo
12
34
57
6
DFS(G)1 Para todo v em G2 Se v não visitado então 3 DFS-Visit(G, v)
DFS-Visit(G, v)1 Marque v como visitado2 Para todo w em Adj(v)3 Se w não visitado então 4 Insira aresta (v, w) na árvore5 DFS-Visit(G, w)
![Page 30: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/30.jpg)
Estruturas Discretas
Busca em Profundidade : Exemplo
12
34
57
6
DFS(G)1 Para todo v em G2 Se v não visitado então 3 DFS-Visit(G, v)
DFS-Visit(G, v)1 Marque v como visitado2 Para todo w em Adj(v)3 Se w não visitado então 4 Insira aresta (v, w) na árvore5 DFS-Visit(G, w)
![Page 31: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/31.jpg)
Estruturas Discretas
Vetor Componente(v) • Armazena um número inteiro correspondente a componente conexa aonde v se encontra
Aplicações: Determinar as Componentes Conexas
![Page 32: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/32.jpg)
Estruturas Discretas
COMPONENTES (G)
1 num =12 Para todo v em G3 Se v não visitado então4 componrnte(v) num5 DFS_visit(v,num)6 num ++
DFS_Visit(v, num)1 Marque v como visitado2 Para todo w em Adj(v)3 Se w não visitado então4 DFS_Visit(w,num)5 componente(w) num
Aplicações: Determinar as Componentes Conexas
![Page 33: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/33.jpg)
Estruturas Discretas
Aplicações: Determinar se um grafo é bipartido
■G = (V,E) = (X,Y,E)
■XY = V
■XY = ■{u,w}E então uX e wY
■Exemplos
■professores e horários
■candidatos e postos
■masculino e feminino
A
B
C
D
E
F
![Page 34: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/34.jpg)
Estruturas Discretas
Aplicações: Determinar se um grafo é bipartido
BIPARTITE (G)1 Bipartite true2 Para todo v em G3 Se v não visitado então 4 DFS_Visit(v,0)
DFS_Visit(v,p)
1 Marque v como visitado2 partição(v) p3 Para todo w em Adj(v)4 Se w não visitado então 5 DFS_Visit (w, 1– p )6 Senão 7 Se partição(w)=p8 Bipartite false
A
B
C
D
E
F
Estrutura de Dados Partição: vetor de |V| posições
• Partição(u) armazena 0 ou 1, dependendo da partição em que o vértice u se encontra
![Page 35: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/35.jpg)
Estruturas Discretas
DFS: Estrutura de Dados
cor• cor(u)=branco, u não foi visitado• cor(u)=cinza, u já foi visitado mas seus vizinhos ainda não• cor(u)=preto, u e seus vizinhos já foram visitados
• (u) = v se e somente se u é visitado quando a lista dos vizinhos de v é percorrida
d • d(u) marca o momento em que u é visitado
f• f(u) marca o momento em que a DFS a partir de u termina (u se torna preto)
![Page 36: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/36.jpg)
Estruturas Discretas
Busca em Profundidade
DFS(G)1 for every vertex u of G2 cor[u]white; [u]NIL3 time04 for every vertex v of G5 if cor[v]=BRANCO then6 DFS-Visit(u)
DFS-Visit(u)1 cor[u]CINZA2 time time+13 d[u] time4 for each v in Adj[u] 5 if cor[v]=BRANCO then6 [v]u; 7 DFS-Visit[u]8 cor[u]NEGRO9 time time+1 10 f[u] time+1
![Page 37: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/37.jpg)
Estruturas Discretas
Busca em Profundidade
![Page 38: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/38.jpg)
Estruturas Discretas
Propriedades da DFS
Teorema 1: Seja T a árvore produzida por uma DFS em G e seja vw uma aresta de G. Se v é visitado antes de w então v é ancestral de w em T.
![Page 39: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/39.jpg)
Estruturas Discretas
Propriedades da DFS
Teorema 2: Sejam u e v dois vértices de G tal que u é visitado antes de v. Então uma das duas possibilidades ocorre
• d(u) < d(v) < f(v) < f(u)• d(u) < f(u) <d(v) < f(v)
![Page 40: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/40.jpg)
Estruturas Discretas
Propriedades da DFS
Teorema 3: Um nó v é descendente de um nó u em uma busca em profundidade se e somente se existe um caminho de u até v que utilize apenas nós com cor branca no momento que u se torna cinza
=> Se existe o caminho branco podemos argumentar por indução no tamanho do caminho. Seja w o primeiro vértice do caminho ‘branco’ que liga u a v que é visitado durante DFS(u). Este w tem que existir já que o sucessor de u no caminho é visitado durante a DFS(u) pela Teorema 1. Segue que w é descendente de u e v é descendente de w pela hipótese de indução.
<= Se não existe caminho branco então DFS(u) não alcança v
![Page 41: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/41.jpg)
Estruturas Discretas
Classificação de arcos em um dígrafo
1. Arco de Árvore: (u,v) é do tipo ‘A’ se v é visitado pela primeira vez quando a lista Adj[u] é percorrida
2. Arco Reverso: (u,v) é do tipo ‘R’ se v é ancestral de u na árvore gerada pela DFS
3. Arco Direto: (u,v) é do tipo ‘D’ se v é descendente de u na árvore gerada pela DFS e (u,v) não é do tipo ‘A’
4. Arco Cruzado: Demais arcos
![Page 42: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/42.jpg)
Estruturas Discretas
Propriedades da DFS
![Page 43: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/43.jpg)
Estruturas Discretas
Prova
Seja C um ciclo em G e seja u o primeiro nó de C visitado pela DFS. Seja v o predecessor de C no ciclo. Portanto, v é descendente de u (caminhos brancos) e o arco (u,v) é reverso.
Seja (u,v) um arco reverso. Portanto, v é descendente de u. Logo, existe um caminho de v para u em G. Adicionando (u,v) a este caminho obtemos um ciclo
Testando se um grafo direcionado contem ciclos
Teorema: O grafo G é cíclico se e somente se a execução de uma DFS em G produz um arco reverso.
![Page 44: Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade](https://reader035.vdocuments.pub/reader035/viewer/2022062512/552fc131497959413d8d5edd/html5/thumbnails/44.jpg)
Estruturas Discretas
DFS(G)1 for every vertex v of G2 do set d[v] 0,f[v] 03 Time 1; Aciclico true4 for every vertex v of G5 if d[v] =0 then 6 DFS(G, v)7 Return Aciclico
DFS_Visit (v)1 d[v] time ; time ++2 For every w in Adj(v)3 if d[w]=0 then 4 DFS_Visit (w)5 Else if f[w]=0 then ( ‘arco reverso’)6 Aciclico false7 f[v] time; time ++
Testando se um grafo direcionado contem ciclos