• Nenhum resultado encontrado

Pontes em grafos e aresta-biconexão

N/A
N/A
Protected

Academic year: 2022

Share "Pontes em grafos e aresta-biconexão"

Copied!
7
0
0

Texto

(1)

Pontes em grafos e aresta-biconexão

S 18.6

Algoritmos em Grafos — 1º sem 2012 1 / 1

Pontes em grafos

Uma aresta de um grafo é uma ponte (= bridge = separation edge) se ela é a única aresta que atravessa algum corte do grafo.

Exemplo:

0

2 1

3

8

10 4

5

6

7 9

Exemplo: as arestas em vermelho são pontes

0

2 1

3

8

10 4

5

6

7 9

Algoritmos em Grafos — 1º sem 2012 2 / 1

Procurando pontes

Problema: encontrar as pontes de um grafo dado Exemplo: as arestas em vermelho são pontes

0

2 1

3

8

10 4

5

6

7 9

Algoritmos em Grafos — 1º sem 2012 3 / 1

all_bridges1

Recebe um grafo G e calcula o número bcnt de pontes do grafo G e imprime todas as pontes.

void all_bridges1 (Graph G);

Algoritmos em Grafos — 1º sem 2012 4 / 1

(2)

Primeiro algoritmo

void all_bridges1 (Graph G) {

Vertex v, w; link p; int ligados;

1 for (v = 0; v < G–>V; v++)

2 for(p=G–>adj[v];p!=NULL;p=p–>next){

3 w = p–>w;

4 if (v < w) {

5 GRAPHremoveA(G,w,v);

6 ligados = DIGRAPHpath(G,w,v);

7 GRAPHinsertA(G,w,v);

8 if (!ligados) {

9 bcnt++;

10 output(v, w);

} } } }

Algoritmos em Grafos — 1º sem 2012 5 / 1

Consumo de tempo

O consumo de tempo da função all_bridges1 é A/2 vezes o consumo de tempo da função

DIGRAPHpath.

O consumo de tempo da função all_bridges1 para vetor de listas de adjacência é O(A(V+A)).

O consumo de tempo da função all_bridges1 para matriz de adjacência é O(AV2).

Algoritmos em Grafos — 1º sem 2012 6 / 1

Pontes e busca em profundidade

Em uma floresta DFS, um dos dois arcos de cada ponte será um arco da arborescência

Exemplo: arcos em vermelho são da arborescência

0

2 1

3

8

10 4

5

6

7 9

Exemplo: arcos em vermelho são da arborescência

0

2 1

8 4

5

6 9

Algoritmos em Grafos — 1º sem 2012 7 / 1

Propriedade

Um arco v-w da floresta DFS faz parte (juntamente com w-v) de uma ponte se e somente se não existe arco de retorno que ligue um descendente de w a um ancestral de v

0

2 1

3

8

10 4

5

6

7 9

Algoritmos em Grafos — 1º sem 2012 8 / 1

(3)

Numeração em ordem de descoberta (pré-ordem)

v 0 1 2 3 4 5 6 7 8 9 10 pre[v] 0 4 1 2 6 8 9 10 3 7 5

0

2 1

3

8

10 4

5

6

7 9

Algoritmos em Grafos — 1º sem 2012 9 / 1

Lowest Preorder Number

O menor número de pré-ordem que pode ser alcançado por v utilizando arcos da arborescência e até um arco de retorno (“arco-pai” não vale) será denotado por low[v]

0

2 1

3

8

10 4

5

6

7 9

Algoritmos em Grafos — 1º sem 2012 10 / 1

Exemplo

v 0 1 2 3 4 5 6 7 8 9 10 pre[v] 0 4 1 2 6 8 9 10 3 7 5 low[v] 0 4 0 0 5 7 7 5 1 7 5

0

2 1

3

8

10 4

5

6

7 9

Algoritmos em Grafos — 1º sem 2012 11 / 1

Observações

Para todo vértice v,

low[v] ≤ pre[v]

Para todo arco v-w do grafo

se v-w é um arco de arborescência então

low[v] ≤ low[w];

se v-w é uma arco de retorno, então

low[v] ≤ pre[w].

Algoritmos em Grafos — 1º sem 2012 12 / 1

(4)

Cálculo de low[v]

Para todo vértice v,

low[v] = min{pre[w]| v-w é um arco de retorno ou v-w é um arco de arborescência}

Algoritmos em Grafos — 1º sem 2012 13 / 1

Algoritmo das pontes

Em qualquer floresta de busca em profundidade de um grafo, um arco de arborescência v-w faz parte de uma ponte se e somente se low[w] == pre[w]

static int cnt, pre[maxV], bcnt, low[maxV];

static int parnt[maxV];

A função abaixo calcula o número bcnt de pontes do grafo G e imprime todas as pontes

void all_bridges (Graph G);

Algoritmos em Grafos — 1º sem 2012 14 / 1

all_bridges

void all_bridges (Graph G) { Vertex v;

1 cnt = bcnt = 0;

2 for (v = 0; v < G->V; v++) 3 pre[v] = -1;

4 for (v = 0; v < G->V; v++) 5 if (pre[v] == -1) {

6 parnt[v] = v;

7 bridgeR(G, v);

} }

bridgeR

void bridgeR (Graph G, Vertex v) { link p; Vertex w;

1 pre[v] = cnt++;

2 low[v] = pre[v];

3 for (p=G->adj[v];p!=NULL;p=p->next) 4 if (pre[w=p->w] == -1) {

5 parnt[w] = v;

6 bridgeR(G, w);

7 if (low[v] > low[w])low[v]=low[w];

9 if (low[w] == pre[w]) {

10 bcnt++;

11 printf("%d-%d\n", v, w);

} }

12 else if (w!=parnt[v] && low[v]>pre[w])

13 low[v] = pre[w];

(5)

Consumo de tempo

O consumo de tempo da função all_bridges é O(V+A).

Algoritmos em Grafos — 1º sem 2012 17 / 1

Aresta-biconexão

Um grafo é aresta-biconexo (=

2-edge-connected) ou 2-aresta-conexo se for conexo e não tiver pontes.

Fato básico importante:

Um grafo é aresta-biconexo se e somente se, para cada par (s,t) de seus vértices, existem (pelo menos) dois caminhos de s a t sem arestas em comum.

Algoritmos em Grafos — 1º sem 2012 18 / 1

Exemplo

É preciso remover pelo menos duas arestas de um grafo aresta-biconexo para que ele deixe de ser conexo

0

2 1

3

8

10 4

5

6

7 9

Algoritmos em Grafos — 1º sem 2012 19 / 1

Articulações e biconexão

S 18.6

Algoritmos em Grafos — 1º sem 2012 20 / 1

(6)

Articulações em grafos

Uma articulação (= articulation point) ou vértice de corte (= cut vertex) de um grafo é um vértice cuja remoção aumenta o número de componentes Exemplo:

0

2 1

3

8

10 4

5

6

7 9

Exemplo: os vértices em vermelho são articulações

0

2 1

3

8

10 4

5

6

7 9

Algoritmos em Grafos — 1º sem 2012 21 / 1

Procurando articulações

Problema: encontrar as articulações de um grafo Exemplo: os vértices em vermelho são articulações

0

2 1

3

8

10 4

5

6

7 9

Algoritmos em Grafos — 1º sem 2012 22 / 1

Articulações e busca em profundidade

É possível encontrar todas as articulações de um grafo através de uma variante da função bridgeR Exemplo: os vértices em vermelho são articulações

0

1 2

3

8

10 4

5

6

7 9

Biconexão

Um grafo é biconexo (= biconnected) ou 2-conexo se é conexo e não tem articulações

0

2 1

3

8

10 4

5

6

7 9

(7)

Fato básico

Um grafo é biconexo se e somente se, para cada par (s,t) de vértices, existem (pelo menos) dois

caminhos de s a t sem vértices internos em comum

0

2 1

3

8

10 4

5

6

7 9

Algoritmos em Grafos — 1º sem 2012 25 / 1

Componentes fortemente conexos

S 19.8 CLRS 22.5

Algoritmos em Grafos — 1º sem 2012 26 / 1

Digrafos fortemente conexos

Um digrafo é fortemente conexo se e somente se para cada par {s,t} de seus vértices, existem

caminhos de s a t e de t a s

Exemplo: um digrafo fortemente conexo

0

5 1

6 7 8

4

9 10

2 3

11 12

Algoritmos em Grafos — 1º sem 2012 27 / 1

Componentes fortemente conexos

Um componente fortemente conexo (= strongly connected) é um conjunto maximal de vértices W tal que digrafo induzido por W é fortemente conexo Exemplo: 4 componentes fortemente conexos

0

5 1

6 7 8

4

9 10

2 3

11 12

Exemplo: 4 componentes fortemente conexos

11 12

1 0

5

3

2

6 7 8

4

9 10

Algoritmos em Grafos — 1º sem 2012 28 / 1

Referências

Documentos relacionados

Um fator relevante na aplicação do projeto foi o entendimento das estrelas na nossa galáxia, que são vistas em céu aparente, bem como a questão do brilho e outros

Enquanto o princípio do interesse público e da sua indisponibilidade é da essência de qualquer Estado, de qualquer sociedade juridicamente organizada, o

Dessa forma, o artigo aborda a questão da importância do ensino dos números racionais nas séries iniciais do ensino fundamental, tendo como pressupostos básicos as idéias

* Funcionamento da grua: 9h com um intervalo de 1h; * Extensão: 1 colaborador Choque Escoriação * Formação sobre boas práticas de trabalho; * Formação sobre

Em Guaíba, não há nenhum tipo de monitoramento contínuo da qualidade do ar, o que inviabilizava a realização de estudos epidemiológicos para investigar os

155 apresenta as causas da indisciplina para os professores: em primeiro lugar, culpam os “tempos modernos”, ou seja, tais educadores se referem a um passado

hierarquização dos problemas da odontologia social, Níveis de prevenção, Organização e Administração de serviços Odontológicos, Planejamento e Avaliação em Odontologia,