30
Exercícios PAA- Grafos Eduardo Laber

Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Embed Size (px)

Citation preview

Page 1: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Exercícios PAA- Grafos

Eduardo Laber

Page 2: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

2

Exercício de Implementação

1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde d(u) é a distância da origem s até o vértice u.

for every vertex v of G not explored yet

d(v) infinito End For

2 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

8 mark vertex v as visited

9 d(v) d(u)+1

10 Enqueue(S,v)

Page 3: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Cap 3-Tardos

Exercício 2

• Modifique o pseudo-código da busca em profundidade da seguinte forma.

• Ao visitar um vértice v a partir de u– Se v não foi visitado faça

• upai (v)

– Se v já foi visitado• Se v<> pai(u)

– Ciclo existe (uv+ caminho de u a v na árvore)

Page 4: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Cap 3-TardosExercicio 2: Ciclo em grafo direcionado

• Execute uma busca em profundidade no grafo anotando, para cada vértice v,– o pai de v– o momento que a busca em v começa: pre(v)– o momento que a busca em v termina: pos(v)

• Ao tentar visitar um vértice v a partir de u tal que a busca em v já começou mais ainda não terminou (pos(v) =-1) podemos obter um ciclo da seguinte forma. – Caminhe pelos pais de u até encontrar v. O ciclo é formado por este

caminho + o arco (u,v)

Page 5: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Cap 3-TardosExercício 3

• Execute uma ordenação topológica no Grafo. Se em algum ponto não houver uma fonte, quer dizer que o grafo contém ciclos.

• Execute o algoritmo do slide anterior

Page 6: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Cap 3-Tardos

Exercício 4• Etapa 1. Construa o grafo G[S] induzido pelas

arestas do conjunto S. Utilize uma DFS(BFS) para determinar as componentes conexas deste grafo. Atribua o número da componente para cada vértice (borboleta).

• Etapa 2. Faça uma varredura nos pares (i,j) tal que a borboleta i é diferente da borboleta j. Se algum par (i, j) for encontrado tal que a borboleta i está na mesma componente de j (conforme etapa 1) então a atribuição é inconsistente. Se nenhum par for encontrado a atribuiçào é consistente.

• O(m+n)

Page 7: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Cap 3-Tardos

Exercício 7• Seja v um nó do grafo. Se u não é vizinho

de v então existe um nó, digamos w, que é vizinho de u e de v. Caso contrário o grafo teria mais de n vértices (n/2 vizinhos de u, n/2 outros vizinhos de v, u e v). Contradição

• Portanto, vwu é um caminho de v para u

Page 8: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Cap 3-Tardos

Exercício 8

• Para um contra exemplo considere uma clique K com n- n0.5 e um único vértice desta clique ligado a um caminho de n0.5 vértices.

Page 9: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Cap 3-Tardos

Exercício 9• Considerar a árvore gerada a partir de

uma busca em largura começando em s.– Como a altura desta árvore é maior que n/2

então existe um nível nesta árvore ( > 1 e < nível t) com apenas um nó.

– Como toda aresta de G liga vértices da mesma camada ou de camadas adjacentes, ao remover este vértice desconectamos o grafo.

Page 10: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Cap 3-Tardos

Exercício 9

• Algoritmo– Faça uma busca em largura calculando a

distância de s a cada nó e preencha um vetor (de listas) indicando, na posição i, os vértices que distam i de s. Retorne o primeiro nó diferente de s que se encontra sozinho em uma lista

Page 11: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Cap 3-Tardos

Exercício 10• Utilizar uma busca em largura para decompor a

árvore em camadas. Marcar para cada nó u a sua distância ao nó de origem v.

• Em uma segunda passada acumular em cada nó u um contador num(u) indicando o número de caminhos de v a u. – Inicialmente os contadores são 0, exceto Num(v)=1. – Ao tentar visitar um nó y, com d(y)=i+1, a partir de

um nó x, com d(x)=i, fazer num(y) num(y)+num(x)

Page 12: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Cap 3-Tardos

Exercício 12Construa um grafo direcionados G da seguinte formaa) Para cada pessoa P(i) crie dois vértices: B(i) – data de

nascimento e D(i), data de morteb) Para todo i, crie uma arco de B(i) para D(i)c) Se nos dados coletados, P(i) morre antes de P(j) nascer

crie um arco de D(i) para B(j)d) Se nos dados coletados, a vida de P(i) tem interseção

com a vida de P(j), crie um arco de P(i) para B(j) e um arco de B(i) para P(j)

Se G tem uma ordenação topológica os dados são consistentes, caso contrário não

Page 13: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Dasgupta-Cap 3

Exercício 8

• Criamos 11*8*5=440 nós e associamos cada nó do grafo a uma tripla (a,b,c) correspondendo a quantidade de água em cada um dos recipientes.

• . Existe uma aresta direcionado de um nó para outro se for possivel de um estado alcancar o outro com um movimento.

Page 14: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Dasgupta-Cap 3

Exercício 8

• Cada nó pode ter 6 arestas partindo dele, logo o número de arestas é no máximo 1320

Page 15: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Dasgupta-Cap 3

Exercício 8

Basta executar uma BFS(DFS) no grafo começando no estado (0,7,4) e verificar se o estado (0,0,0) e alcançável

Page 16: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Dasgupta-Cap 3

Exercício 9• Duas passadas completas na lista de

adjacência do grafo– A primeira passada calcula o grau de cada

vértice• For each v in Adj[u]

– degree(u) degree(u)+1

– Na segunda, acumulamos em twodegree[u], para cada u, a soma dos graus dos vizinhos de u.

• For each v in Adj[u]– Twodegree[u] Twodegree[u]+d(v)

Page 17: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Dasgupta-Cap 3

Exercício 13

a) Defina um vértice s em G e execute uma DFS a partir de s. Seja T a árvore obtida. Qualquer folha de T satisfaz a propriedade desejada

b) Qualquer Ciclo direcionado

c) G= dois ciclos disjuntos

Page 18: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Dasgupta-Cap 3

Exercício 15

a) Seja G=(V,E) o grafo direcionado em que V é o conjunto de interseções de ruas e E representa o conjunto das ruas

• Verifique se o grafo é fortemente conexo utilizando o algoritmo ensinado em sala com complexidade O(m+n)

Page 19: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Dasgupta-Cap 3

Exercício 15b) Seja v o nó correspondente a Town Hall. Seja

S o conjunto de nó alcançáveis a partir de v. S pode ser obtido em O(m+n) através de uma DFS( BFS).Seja G’ o grafo reverso de G. Seja T o conjunto de nós obtidos a partir de v em G’. Se S for um subconjunto de T então a propriedade é verdadeira. Caso contrário, é falsa. Podemos testar se S e subconjunto de T em O(n)

Page 20: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Dasgupta-Cap 3

Exercício 18

• Execute uma DFS em G a partir de r e armazene os contadores pre e post para cada vértice do grafo.

• u é ancestral de v se e somente sepre[u] <pre[v]< post[v]<post[u]

Page 21: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Dasgupta-Cap 3

Exercício 22• Execute uma DFS em G e armazene os

contadores pre e post para cada vértice do grafo. Seja v o vértice com maior post. Sabemos que ele pertence a um source node em G~ (aula de componentes fortemente conexos).

• Execute uma DFS começando em v. Se apenas uma árvore for gerada então existe o nó desejado. Caso contrário, não.

Page 22: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Dasgupta-Cap 3

Exercício 24

Execute o algoritmo linear para ordenação topológica.

• Se em algum ponto o conjunto S dos vértices com grau de entrada igual a 0 tiver mais de um elemento, então G não possui o caminho desejado. Caso contrário, ordem topológica é o caminho desejado.

Page 23: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

23

Exercicio Resolvido

Problema

Seja um grafo G=(V,E) representando a planta de um edifício. Inicialmente temos dois robos localizados em dois vértices de V, a e b, que devem alcançar os vértices c e d de V.

A cada passo um dos robos deve caminhar para um vértice adjacente ao vértice que ele se encontra no momento.

Exiba um algoritmo polinomial que decida se é possível, ou não, os robos partirem de a e b e chegarem em c e d, respectivamente, sem que em nenhum momento eles estejam a distância menor do que r, onde r é um inteiro dado.

Page 24: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

24

Exercicio Resolvido

SoluçãoSeja H um grafo representando as configurações possíveis (posições dos robos) do problema. Cada nó de H corresponde a um par ordenado de vértices de V cuja distância menor ou igual a r. Um par de nós u e v de H tem uma aresta se e somente em um passo é possível alcançar a configuração v a partir da configuração u em um único passo, ou seja, se u=(u1,u2) e v=(v1,v2) então uma das alternativas é válida(i) u1=v1 e (u2,v2) pertence a E (i) u2=v2 e (u1,v1) pertence a E

O problema portanto consiste em decidir se existe um camìnho entre o nó (a,b) e o nó (c,d) em H. Isso requer tempo linear no tamanho de H. Como H tem O(n2) vértices e O(n3) arestas, o algoritmo executa em O(n3) .

Page 25: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Dasgupta, Cap 4 -Exercício 11

• Execute Dijkstra a partir de cada vértice v. O(|V|3)

• Guarde em uma tabela Dist a menor distância Dist(u,v) entre u e v para cada para u,v

• Procure na tabela Dist o par de vértices u,v que minimiza Dist(u,v)+Dist(v,u). Se o mínimo é infinito então o grafo é acíclico– O(|V|3), já que temos que considerar todos os

pares

Page 26: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Dasgupta, Cap 4 -Exercício 12

• Seja e=(u,v)

• Remova a aresta e de G– O(|V|)

• Execute Dijkstra para encontrar o caminho P de custo mínimo entre v e u em G-e. – O(|V|2), utilizando vetor como fila de

prioridades

• O ciclo é dado pela união de P com e.

Page 27: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Dasgupta, Cap 4 -Exercício 14

1. Execute Dijkstra para encontrar o caminho de custo mínimo entre v0 e os demais vertices em G

2. Execute Dijkstra para encontrar o caminho de custo mínimo entre v0 e os demais vertices em GR (grafo reverso)

3. O caminho mínimo entre u e w passando por vo é o caminho mínimo entre u e v0 e vo e w

Page 28: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Dasgupta, Cap 4 -Exercício 17.a

• Utilize um vetor de nW posições como fila de prioridade.

• A posição i do vetor deve guardar os nós v tal que o custo π(v) do menor caminho da origem s até v é i.

Page 29: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

Dasgupta, Cap 4 -Exercício 17.a

• Portanto, encontrar o custo total de encontrar o vértice com menor valor π() requer O(nW) operações– Se o ultimo vértice colocado em S foi u então

a busca pelo menor valor de π() deve ser feita a partir de π(u).

• As atualizações podem ser feitas em O(E)

Page 30: Exercícios PAA- Grafos Eduardo Laber. 2 Exercício de Implementação 1. Modifique o código da BFS para que esta preencha um vetor d com n entradas aonde

ESTUDEM