Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 Datas da provas – turma 94 P1: 27 de abril P2: 25 de maio P3: 29 de junho Prova SUB (fechada): 06 de julho 2 ACH2024 Aulas 05 e 06 – Grafos: Busca em Profundidade Profa. Ariane Machado Lima 3Slide do livro do Ziviani – cap 7 (antecessor de v) 4Slide do livro do Ziviani – cap 7 Medidores de tempo: úteis para - acompanhar a evolução da busca - utilizados em vários algoritmos de grafos 5Slide do livro do Ziviani – cap 7 Cada vértice tem: cor(d[v],t[v]) 6 7 buscaProfundidade(grafo){ Aloca vetores cor, tdesc, tterm, antecessor com tamanho grafo->nrVertices tempo ← 0; Para cada vertice v cor[v] ← branco; tdesc[v] = tterm[v] = 0; antecessor[v] ← -1; Para cada vertice v Se cor[v] = branco visitaBP(v, grafo, &tempo, cor, tdesc, tterm, antecessor); } visitaBP(v, grafo, tempo, cor, tdesc, tterm, antecessor){ cor[v] ← cinza; tdesc[v] ← ++(*tempo); Para cada vertice u da lista de adjacência de v Se u é branco antecessor[u] ← v; visitaBP(u, grafo, &tempo, cor, tdesc, tterm, antecessor); tterm ← ++(*tempo); cor[v] ← preto; } 8Slide do livro do Ziviani – cap 7 9 Busca em Profundidade: Análise Essa complexidade vale para as duas implementações de grafos? Se não: - qual a complexidade para matrizes e listas de adjacência? - então deve-se sempre usar uma ao invés de outra? Se não, por quê? 10Slide do livro do Ziviani – cap 7 11Slide do livro do Ziviani – cap 7 (u,v) é avanço se tdesc[u] <= tdesc[v] cruzamento caso contrário 12 Observação Se o grafo é não direcionado, a busca em profundidade produzirá apenas arestas de árvore e arestas de retorno Por quê? 13 Algumas aplicações de busca em profundidade 14 Identificar se um grafo é acíclico ou não 15Slide do livro do Ziviani – cap 7 16 Exercício Implemente tal algoritmo 17 Slide do livro do Ziviani – cap 7 18 19 Como poderíamos obter tal ordenação? Quem são as últimas “tarefas”? As que não têm tarefas adjacentes. Então os vértices que não possuem arestas SAINDO deles devem ficar no fim da lista (ou seja, serem inseridos primeiro em uma lista ligada, com inserção sempre na frente) E depois? Remove esse vértice recém inserido (e as arestas que chegam nele) e recomeça o processo. 20 Como poderíamos obter tal ordenação? Quem são as últimas “tarefas”? As que não têm tarefas adjacentes. Então os vértices que não possuem arestas SAINDO deles devem ficar no fim da lista (ou seja, serem inseridos primeiro em uma lista ligada, com inserção sempre na frente) E depois? Remove esse vértice recém inserido (e as arestas que chegam nele) e recomeça o processo. 21 Como poderíamos obter tal ordenação? Quem são as últimas “tarefas”? As que não têm tarefas adjacentes. Então os vértices que não possuem arestas SAINDO deles devem ficar no fim da lista (ou seja, serem inseridos primeiro em uma lista ligada, com inserção sempre na frente) E depois? Remove esse vértice recém inserido (e as arestas que chegam nele) e recomeça o processo. 22 Como poderíamos obter tal ordenação? Quem são as últimas “tarefas”? As que não têm tarefas adjacentes. Então os vértices que não possuem arestas SAINDO deles devem ficar no fim da lista (ou seja, serem inseridos primeiro em uma lista ligada, com inserção sempre na frente) E depois? Remove esse vértice recém inserido (e as arestas que chegam nele) e recomeça o processo. 23 Como poderíamos obter tal ordenação? Quem são as últimas “tarefas”? As que não têm tarefas adjacentes. Então os vértices que não possuem arestas SAINDO deles devem ficar no fim da lista (ou seja, serem inseridos primeiro em uma lista ligada, com inserção sempre na frente) E depois? Remove esse vértice recém inserido (e as arestas que chegam nele) e recomeça o processo. 24 Como poderíamos obter tal ordenação? Quem são as últimas “tarefas”? As que não têm tarefas adjacentes. Então os vértices que não possuem arestas SAINDO deles devem ficar no fim da lista (ou seja, serem inseridos primeiro em uma lista ligada, com inserção sempre na frente) E depois? Remove esse vértice recém inserido (e as arestas que chegam nele) e recomeça o processo. 25 Como poderíamos obter tal ordenação? Quem são as últimas “tarefas”? As que não têm tarefas adjacentes. Então os vértices que não possuem arestas SAINDO deles devem ficar no fim da lista (ou seja, serem inseridos primeiro em uma lista ligada, com inserção sempre na frente) E depois? Remove esse vértice recém inserido (e as arestas que chegam nele) e recomeça o processo. Qual seria a complexidade desse algoritmo? 26 Como poderíamos obter tal ordenação? Quem são as últimas “tarefas”? As que não têm tarefas adjacentes. Então os vértices que não possuem arestas SAINDO deles devem ficar no fim da lista (ou seja, serem inseridos primeiro em uma lista ligada, com inserção sempre na frente) E depois? Remove esse vértice recém inserido (e as arestas que chegam nele) e recomeça o processo. Qual seria a complexidade desse algoritmo? Pode chegar a O(V3) A questão é como achar, de forma eficiente, os vértices sem adjacentes... 27 Como poderíamos obter essa informação dos vértices sem adjacentes, a cada passo, de forma eficiente? 28 Como poderíamos obter essa informação dos vértices sem adjacentes, a cada passo, de forma eficiente? BUSCA EM PROFUNDIDADE! 29 Como poderíamos obter essa informação dos vértices sem adjacentes, a cada passo, de forma eficiente? BUSCA EM PROFUNDIDADE! Como? Insere o vértice no início da lista quando ele se tornar preto... 30 Como poderíamos obter essa informação dos vértices sem adjacentes, a cada passo, de forma eficiente? BUSCA EM PROFUNDIDADE! Como? Insere o vértice no início da lista quando ele se tornar preto... 31 Desta forma, os vértices ficaram ordenados decrescentemente pelo tempo de término. Por quê? 32Slide do livro do Ziviani – cap 7 33 Encontrar um caminho entre dois vértices u e v 34 Encontrar um caminho entre dois vértices u e v Partindo de u, o vértice v deve ser visitado (ou seja, deve pertencer à árvore de busca em profundidade com raiz em u) 35 Componentes conexos de um grafo não direcionado 36 Componentes conexos de um grafo não direcionado Em um grafo não direcionado (não necessariamente verdade em um direcionado): - cada vértice está contido em exatamente um componente conexo - para cada vértice v, o componente conexo que contém v é exatamente o conjunto de todos os vértices alcançáveis por v 37 Componentes conexos de um grafo não direcionado Cada árvore de busca em profundidade corresponde a um componente conexo 38Slide do livro do Ziviani – cap 7 39Slide do livro do Ziviani – cap 7 40Slide do livro do Ziviani – cap 7 41Slide do livro do Ziviani – cap 7 42Slide do livro do Ziviani – cap 7 Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22 Slide 23 Slide 24 Slide 25 Slide 26 Slide 27 Slide 28 Slide 29 Slide 30 Slide 31 Slide 32 Slide 33 Slide 34 Slide 35 Slide 36 Slide 37 Slide 38 Slide 39 Slide 40 Slide 41 Slide 42
Compartilhar