A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade.

Apresentações semelhantes


Apresentação em tema: "Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade."— Transcrição da apresentação:

1 Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade

2 Estruturas Discretas BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s) 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 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

3 Estruturas Discretas Exemplo BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v) S

4 Estruturas Discretas Exemplo BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v) S

5 Estruturas Discretas Exemplo S BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v)

6 Estruturas Discretas Exemplo S BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v)

7 Estruturas Discretas Exemplo S BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v)

8 Estruturas Discretas Exemplo S BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v)

9 Estruturas Discretas Exemplo S BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v)

10 Estruturas Discretas Exemplo S BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v)

11 Estruturas Discretas Exemplo S BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v)

12 Estruturas Discretas Exemplo S BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v)

13 Estruturas Discretas Exemplo S BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v)

14 Estruturas Discretas Exemplo S BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v)

15 Estruturas Discretas Exemplo S BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v)

16 Estruturas Discretas Exemplo S BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v)

17 Estruturas Discretas Exemplo S 3 BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v)

18 Estruturas Discretas Exemplo S 3 BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v)

19 Estruturas Discretas Exemplo S BFS(G) 1 for every vertex s of G not explored yet 2 do Enqueue(S,s); 3 mark vertex s as visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8 mark edge (v,u) as tree edge 9 mark vertex v as visited 10 Enqueue(S,v) 7

20 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 visited 4 while S is not empty do 5 u Dequeue(S); 6 For each v in Adj[u] then 7 if v is unexplored then 8d[v] d[u]+1 (atualiza o valor de d[v]) 9 mark edge (v,u) as tree edge 10 mark vertex v as visited 11 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

21 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 L i e w L j, |i – j| 1. L0L0 L1L1 L2L2 L3L3 L4L4

22 Estruturas Discretas Busca em Profundidade DFS(G) 1Para todo v em G 2Se v não visitado então 3DFS-Visit(G, v) DFS-Visit(G, v) 1Marque v como visitado 2 Para todo w em Adj(v) 3 Se w não visitado então 4 Insira aresta (v, w) na árvore 5 DFS-Visit(G, w)

23 Estruturas Discretas Busca em Profundidade : Exemplo DFS(G) 1Para todo v em G 2Se v não visitado então 3DFS-Visit(G, v) DFS-Visit(G, v) 1Marque v como visitado 2 Para todo w em Adj(v) 3 Se w não visitado então 4 Insira aresta (v, w) na árvore 5 DFS-Visit(G, w)

24 Estruturas Discretas Busca em Profundidade : Exemplo DFS(G) 1Para todo v em G 2Se v não visitado então 3DFS-Visit(G, v) DFS-Visit(G, v) 1Marque v como visitado 2 Para todo w em Adj(v) 3 Se w não visitado então 4 Insira aresta (v, w) na árvore 5 DFS-Visit(G, w)

25 Estruturas Discretas Busca em Profundidade : Exemplo DFS(G) 1Para todo v em G 2Se v não visitado então 3DFS-Visit(G, v) DFS-Visit(G, v) 1Marque v como visitado 2 Para todo w em Adj(v) 3 Se w não visitado então 4 Insira aresta (v, w) na árvore 5 DFS-Visit(G, w)

26 Estruturas Discretas Busca em Profundidade : Exemplo DFS(G) 1Para todo v em G 2Se v não visitado então 3DFS-Visit(G, v) DFS-Visit(G, v) 1Marque v como visitado 2 Para todo w em Adj(v) 3 Se w não visitado então 4 Insira aresta (v, w) na árvore 5 DFS-Visit(G, w)

27 Estruturas Discretas Busca em Profundidade : Exemplo DFS(G) 1Para todo v em G 2Se v não visitado então 3DFS-Visit(G, v) DFS-Visit(G, v) 1Marque v como visitado 2 Para todo w em Adj(v) 3 Se w não visitado então 4 Insira aresta (v, w) na árvore 5 DFS-Visit(G, w)

28 Estruturas Discretas Busca em Profundidade : Exemplo DFS(G) 1Para todo v em G 2Se v não visitado então 3DFS-Visit(G, v) DFS-Visit(G, v) 1Marque v como visitado 2 Para todo w em Adj(v) 3 Se w não visitado então 4 Insira aresta (v, w) na árvore 5 DFS-Visit(G, w)

29 Estruturas Discretas Busca em Profundidade : Exemplo DFS(G) 1Para todo v em G 2Se v não visitado então 3DFS-Visit(G, v) DFS-Visit(G, v) 1Marque v como visitado 2 Para todo w em Adj(v) 3 Se w não visitado então 4 Insira aresta (v, w) na árvore 5 DFS-Visit(G, w)

30 Estruturas Discretas Busca em Profundidade : Exemplo DFS(G) 1Para todo v em G 2Se v não visitado então 3DFS-Visit(G, v) DFS-Visit(G, v) 1Marque v como visitado 2 Para todo w em Adj(v) 3 Se w não visitado então 4 Insira aresta (v, w) na árvore 5 DFS-Visit(G, w)

31 Estruturas Discretas Vetor Componente(v) Armazena um número inteiro correspondente a componente conexa aonde v se encontra Aplicações: Determinar as Componentes Conexas

32 Estruturas Discretas COMPONENTES (G) 1num =1 2 Para todo v em G 3Se v não visitado então 4componrnte(v) num 5DFS_visit(v,num) 6 num ++ DFS_Visit(v, num) 1Marque v como visitado 2 Para todo w em Adj(v) 3 Se w não visitado então 4 DFS_Visit(w,num) 5 componente(w) num Aplicações: Determinar as Componentes Conexas

33 Estruturas Discretas Aplicações: Determinar se um grafo é bipartido G = (V,E) = (X,Y,E) X Y = V X Y = {u,w} E então u X e w Y Exemplos professores e horários candidatos e postos masculino e feminino A B C D E F

34 Estruturas Discretas Aplicações: Determinar se um grafo é bipartido BIPARTITE (G) 1Bipartite true 2 Para todo v em G 3Se v não visitado então 4DFS_Visit(v,0) DFS_Visit(v,p) 1 Marque v como visitado 2 partição(v) p 3 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)=p 8Bipartite 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

35 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)

36 Estruturas Discretas Busca em Profundidade DFS(G) 1 for every vertex u of G 2cor[u] white; [u] NIL 3 time 0 4 for every vertex v of G 5if cor[v]=BRANCO then 6DFS-Visit(u) DFS-Visit(u) 1 cor[u] CINZA 2 time time+1 3 d[u] time 4 for each v in Adj[u] 5 if cor[v]=BRANCO then 6 [v] u; 7 DFS-Visit[u] 8 cor[u] NEGRO 9 time time+1 10 f[u] time+1

37 Estruturas Discretas Busca em Profundidade

38 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.

39 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)

40 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

41 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

42 Estruturas Discretas Propriedades da DFS

43 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.

44 Estruturas Discretas DFS(G) 1for every vertex v of G 2do set d[v] 0,f[v] 0 3Time 1; Aciclico true 4for every vertex v of G 5 if d[v] =0 then 6DFS(G, v) 7 Return Aciclico DFS_Visit (v) 1d[v] time ; time ++ 2For 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 false 7f[v] time; time ++ Testando se um grafo direcionado contem ciclos


Carregar ppt "Estruturas Discretas Caminhamento em Grafos: Busca em Largura e Busca em Profundidade."

Apresentações semelhantes


Anúncios Google