MAC0338   An�lise de Algoritmos

 

�rvores geradoras de grafos

Esta p�gina � uma prepara��o para o cap�tulo 24 de CLR.

 

�rvores geradoras

Suponha que r � um v�rtice de um grafo. Uma �rvore geradora com raiz r � um conjunto A de arestas que seja minimal com rela��o � seguinte propriedade:

para todo v�rtice v ,  existe um caminho de r a v em A.

A express�o "geradora" est� a� para dizer que todo v�rtice do grafo pode ser atingido em A a partir de r.  A express�o "em A" significa que todas as arestas do caminho pertencem a A.

A condi��o "minimal" (ou seja, para toda aresta a em A, o conjunto A-{a} n�o tem a propriedade) na defini��o de �rvore geradora � fundamental. Uma conseq��ncia dessa condi��o � que, para cada v, existe apenas um caminho de r a v.

� claro que s� existe �rvore geradora com raiz r se o territ�rio de r � o conjunto de todos os v�rtices. Se o grafo � sim�trico, s� existe �rvore geradora, qualquer que seja r, se o grafo � conexo. Reciprocamente, se um grafo sim�trico � conexo ent�o cada um de seus v�rtices � raiz de uma �rvore geradora.

 

�rvores geradoras no computador: vetor de predecessores

Qualquer �rvore geradora com raiz r pode ser representada no computador por um "vetor de predecessores", digamos pred. Para cada v�rtice v, pred[v] � o predecessor de v no �nico caminho que leva de r a v na �rvore.   � evidente que r n�o tem predecessor. Os v�rtices que n�o podem ser alcan�ados a partir de r tamb�m n�o t�m predecessor.

O conjunto de arestas da �rvore ser� simplesmente o conjunto de todas as arestas da forma (pred[v],v) com v diferente de r.

� claro que pred � um vetor indexado por v�rtices com valores que tamb�m s�o v�rtices. Oooops! Pequena corre��o: pred[u] tamb�m pode ter o valor especial NIL, que indica aus�ncia de predecessor.  (Na verdade, esse NIL � um pouco estranho. O CLR usa NIL porque ele est� imaginando uma implementa��o sofisticada em que cada v�rtice � um ponteiro. Se os seus v�rtices s�o 1, 2, . . . , n ent�o faz mais sentido usar 0 no lugar de NIL.)

Por exemplo, se r = 1 e a �rvore tem um caminho (1,2,3,4,5) ent�o pred ter� a apar�ncia indicada na figura.

 

. . . 1 2 3 4 5 . . .
  0 1 2 3 4  

 

Para obter um caminho m�nimo que termina em v basta construir a seq��ncia

v,   predecessor de v,   predecessor do predecesssor de v,   etc.

at� chegar a r. Depois, � s� imprimir a seq��ncia de-tr�s-pra-frente.

Eis como extrair de pred um caminho m�nimo de s a um v�rtice v (se n�o existe caminho algum de s a v ent�o o algoritmo n�o imprima nada):

IMPRIMA-CAMINHO-REC (pred, s, v)
  se v = s
    ent�o imprima s
    sen�o se pred[v] <> NIL
        ent�o IMPRIMA-CAMINHO (pred, s, pred[v])
            imprima v

Se voc� n�o se incomoda em receber o caminho de-tr�s-pra-diante ent�o pode usar a seguinte vers�o iterativa (se n�o existe caminho algum de s a v ent�o o algoritmo n�o imprima nada):

IMPRIMA-CAMINHO-IT (pred, s, v)
  se pred[v] <> NIL ent�o
    enquanto v <> NIL fa�a
      imprima v
      v := pred[v]

 

Constru��o de uma �rvore geradora

Problema: Dado um grafo e um v�rtice r, encontrar uma (qualquer uma) �rvore geradora com raiz r.   � muito f�cil resolver o problema com um algoritmo guloso. No in�cio de cada itera��o temos duas classes de v�rtices, a classe dos v�rtices NEGROs e a classe dos BRANCOs, e uma �rvore com raiz r que "cobre" o conjunto dos v�rtices NEGROs. Cada itera��o acrescenta � �rvore alguma aresta que vai de um v�rtice NEGRO a um v�rtice BRANCO e em seguida pinta esse �ltimo v�rtice de NEGRO.

Vamos supor que os v�rtices do grafo s�o 1, 2, . . . , n. Para administrar a coisa, conv�m introduzir uma terceira cor CINZA.

 









10 
11 
RVORE (n, Adj, r)
  para u := 1 at� n fa�a
    cor[u] := BRANCO
    pred[u] := 0
  cor[r] := CINZA
  enquanto existe u tal que cor[u] = CINZA fa�a
    para cada v em Adj[u] fa�a
      se cor[v] = BRANCO ent�o
        cor[v] := CINZA
        pred[v] := u
    cor[u] := NEGRO
  devolva pred

Veja como a sa�da de nosso algoritmo � sofisticada: O algoritmo devolve um vetor pred. Se pred[v] � diferente de 0 para todo v�rtice exceto r (� justamente isso que acontece quando o grafo � conexo) ent�o o vetor pred representa uma �rvore geradora com raiz r.  Se pred[v] = 0 para algum v diferente de r ent�o o grafo n�o � conexo e portanto n�o tem �rvore geradora (nesse caso, pred representa uma �rvore geradora do "peda�o" do grafo que cont�m r).

Qual o tamanho da �rvore que o algoritmo produz, supondo que o grafo � conexo?  Resposta: a �rvore tem

n-1   arestas.

Prova: No fim da linha 4, a �rvore tem 0 arestas e "cobre" 1 v�rtice. A cada passagem pelo par de linhas 8-9, a �rvore ganha 1 aresta (a aresta (u,v)) e passa a "cobrir" um novo v�rtice (o v�rtice v). Conclus�o: no in�cio de cada nova execu��o do bloco de linhas 6-10 nossa �rvore tem x-1 arestas e "cobre" x.

N�o � dif�cil mostrar que toda e qualquer �rvore geradora em um grafo com n v�rtices tem n-1 arestas. De fato, gra�as � liberdade de escolha do v�rtice u na linha 5, o algoritmo �RVORE pode gerar qualquer �rvore geradora desejada.

 

Exerc�cios

  1. Suponha que um grafo sim�trico tem um �rvore geradora com raiz r. Digamos que essa �rvore � representada por um vetor pred. Escreva um algoritmo que receba pred e um v�rtice s e devolva o vetor de predecessores de uma �rvore geradora com raiz s.

 

 

 


Last modified: Fri Jul 30 13:41:43 EST 1999
Paulo Feofiloff
IME-USP

Valid HTML 4.0!