Grafos Procura (1) Algumas propriedades simples em grafos so - - PDF document

grafos procura 1
SMART_READER_LITE
LIVE PREVIEW

Grafos Procura (1) Algumas propriedades simples em grafos so - - PDF document

Grafos Procura (1) Algumas propriedades simples em grafos so fceis de determinar, independentemente da ordem pela qual se examinam as arestas. Ex: grau de todos os vrtices. Outras propriedades esto associadas a


slide-1
SLIDE 1

AED (IST/DEEC) 44

Grafos – Procura (1)

  • Algumas propriedades simples em grafos são fáceis de

determinar, independentemente da ordem pela qual se examinam as arestas.

– Ex: grau de todos os vértices.

  • Outras propriedades estão associadas a caminhos, pelo que

se torna necessário identificá-las através de pesquisa feita de vértice em vértice ao longo das arestas.

  • A maioria dos algoritmos em grafos que consideraremos

usam este modelo abstracto básico.

  • Torna-se

então necessário analisar

  • essencial

dos algoritmos de procura em grafos e suas propriedades estruturais.

AED (IST/DEEC) 45

Grafos – Procura (2)

  • Procurar em grafos é equivalente a percorrer labirintos

– Necessário marcar pontos já visitados – Ser-se capaz de recuar, num caminho efectuado, até ao ponto de partida.

  • Os vários algoritmos de procura em grafos mais não fazem

que executar uma determinada estratégia de procura em labirintos.

– Procura em profundidade primeiro (DFS – “Depth-first-search”). – Admite duas implementações: recursiva e com uso de pilha explícita. – Substituindo a pilha por uma fila FIFO, transforma-se em procura em largura primeiro (BFS – “Breadth-first-search”).

slide-2
SLIDE 2

AED (IST/DEEC) 46

Grafos – Exploração de labirintos (1)

  • Teseu e o seu pequeno problema com o Minotauro

– Desenrolar um rolo de fio para poder voltar ao princípio – Marcar os lugares já visitados para evitar repetição.

  • Nós e os grafos

– Existem lâmpadas, inicialmente apagadas, em cada encruzilhada – vértice. – Cada corredor – aresta – possui um par de portas, inicialmente fechadas, no início e no fim deste. – As portas têm janelas que nos permitem ver se a porta do lado

  • posto

está

  • u

não fechada e se a luz da encruzilhada correspondente está ou não acesa. – O objectivo é regressar à encruzilhada inicial tendo aberto todas as portas e acendido todas as luzes. – Necessitamos um conjunto de regras que garanta que tal acontece.

AED (IST/DEEC) 47

  • Estratégia – Exploração de Tremaux

1. Abrir uma qualquer porta que esteja fechada e dê acesso a uma saída da presente encruzilhada (deixá-la aberta). Se todas as portas estiverem abertas, saltar para 3. 2. Se a partir da porta que foi aberta for visível que a encruzilhada em que o corredor termina foi acesa, abrir outra porta (passo 1). Caso contrário (a encruzilhada está às escuras), seguir o corredor, desenrolando o fio, até essa encruzilhada, acender a luz e voltar ao passo 1. 3. Se todas as portas estão abertas na presente encruzilhada, verificar se é a primeira visitada. Se sim, parar. Se não, usar o fio para recuar até à última encruzilhada visitada e voltar ao passo 1.

Grafos – Exploração de labirintos (2)

slide-3
SLIDE 3

AED (IST/DEEC) 48

Grafos – Exemplo de execução (DFS)

AED (IST/DEEC) 49

Grafos – Exemplo de execução (DFS)

4 6 2

slide-4
SLIDE 4

AED (IST/DEEC) 50

Grafos – Exemplo de execução (DFS)

5 3 4 6 2

AED (IST/DEEC) 51

Grafos – Exemplo de execução (DFS)

5 3 4 6 2

slide-5
SLIDE 5

AED (IST/DEEC) 52

Grafos – Exemplo de execução (DFS)

5 3 4 6 2

AED (IST/DEEC) 53

Grafos – Exemplo de execução (DFS)

5 3 7 4 6 2

slide-6
SLIDE 6

AED (IST/DEEC) 54

Grafos – Exemplo de execução (DFS)

5 3 1 7 4 6 2

AED (IST/DEEC) 55

Grafos – Exemplo de execução (DFS)

5 3 1 7 4 6 2

slide-7
SLIDE 7

AED (IST/DEEC) 56

Grafos – Exemplo de execução (DFS)

5 3 1 7 4 6 2

AED (IST/DEEC) 57

Grafos – Exemplo de execução (DFS)

5 3 1 7 4 6 2

slide-8
SLIDE 8

AED (IST/DEEC) 58

Grafos – Estratégia de Tremaux

  • Prop: Quando se usa a estratégia de exploração de labirintos de

Tremaux abrem-se todas as portas, acendem-se todas as luzes e termina-se no local de partida.

  • Demonstração (esboço):

– Prova-se por indução, mostrando primeiro ser verdade para um labirinto com apenas uma encruzilhada e nenhum corredor – basta acender a única luz. – Para um labirinto com mais que uma encruzilhada assume-se ser verdade para todos os labirintos menores com menos encruzilhadas. – Bastará mostrar que se visitam todas as intersecções, dado que se abrem todas as portas de cada uma delas. – Considere-se o primeiro corredor tomado. – O grafo fica dividido em dois sub-grafos: as intersecções que se visitam sem regressar à origem; e as que só são visitáveis regressando ao ponto de partida.

AED (IST/DEEC) 59

Grafos – DFS

  • Notar que a estratégia de procura de Tremaux, mais não é

que procura em profundidade primeiro.

  • O algoritmo

procede sempre abrindo uma porta e afastando-se da origem, até que chega a um ponto em que não pode abrir mais portas, tendo então que recuar até ao último ponto onde deixou, pelo menos, uma porta por abrir.

  • Se ao recuar nunca encontrar portas por abrir, acabará

regressando ao ponto de partida, dado que o fio que desenrolou no caminho descendente, lhe permite esse regresso.

slide-9
SLIDE 9

AED (IST/DEEC) 60

Grafos – Implementação de DFS

(matriz de adjacências) #define dfsR search void dfsR(Graph G, Edge e) { int t, w = e.w; pre[w] = cnt++; for (t = 0; t < G->V; t++) if (G->adj[w][t] != 0) if (pre[t] == -1) dfsR(G, EDGE(w, t)); } Função a ser chamada a partir de uma função de procura genérica (“ADT style”) que inicializa o contador cnt a zero e todas as entradas da tabela indexada pelos vértices pre a –1.

AED (IST/DEEC) 61

Grafos – Descrição da Implementação

  • A tabela pre está associada com as lâmpadas. Se pre[i]

valer –1, significa que a luz está apagada para esse vértice.

  • Quando se encontra uma aresta para um vértice em que

pre não vale –1, um vértice já visitado, essa aresta não é seguida.

  • Finalmente, a própria estrutura da recursão estabelece o

mecanismo equivalente a desenrolar o novelo de fio.

  • Quando um vértice não possui mais vértices adjacentes

com pre igual a –1, a chamada recursiva termina, devolvendo o controlo de execução para o vértice que o antecedeu na recursão.

  • O retorno da recursão é equivalente a voltar a enrolar o fio.
slide-10
SLIDE 10

AED (IST/DEEC) 62

Grafos – Implementação de DFS

(listas de adjacências) #define dfsR search void dfsR(Graph G, Edge e) { link t; int w = e.w; pre[w] = cnt++; for (t = G->adj[w]; t != NULL; t = t->next) if (pre[t->v] == -1) dfsR(G, EDGE(w, t->v)); }

AED (IST/DEEC) 63

Grafos – Comparação

  • Na implementação por matriz de adjacências, para cada

vértice examinam-se todos as arestas que lhe são incidentes por ordem de numeração dos vértices de saída.

– Avança sempre pelo primeiro (de índex mais baixo) que não tenha sido visitado e lhe é adjacente.

  • Na

implementação por listas de adjacências, são imediatamente considerados os vértices adjacentes e a

  • rdem de inspecção pode não coincidir com a numeração.

– Avança sempre pelo primeiro da lista de adjacências que não tenha sido ainda visitado.

slide-11
SLIDE 11

AED (IST/DEEC) 64

Grafos – ADT para procura

static int cnt, pre[maxV]; void GRAPHsearch(Graph G) { int v; cnt = 0; for (v = 0; v < G->V; v++) pre[v] = -1; for (v = 0; v < G->V; v++) if (pre[v] == -1) search(G, EDGE(v, v)); } GRAPHsearch é uma função ADT para procura genérica em grafos, realizando os seguintes passos:

  • 1. Encontra um vértice não

marcado.

  • 2. Visita (e marca como visi-

tados) todos os vértices no sub-grafo ligado a que o primeiro vértice pertence. A função de procura não é especificada a este nível de abstracção.

AED (IST/DEEC) 65

Grafos – Propriedades da procura

  • Prop: Uma função de procura em grafos marca cada vértice

do grafo se e só se a função de procura que usa marcar cada vértice do sub-grafo ligado que contiver o vértice inicial.

– Demonstração trivial por indução no número de sub-grafos ligados máximos.

  • Prop: A DFS num grafo representado por matriz de adja-

cências requer um tempo proporcional a V2.

– Cada entrada da matriz de adjacências é inspeccionada uma só vez.

  • Prop: A DFS num grafo representado por listas de adja-

cências requer um tempo proporcional a V + E.

– Inicialização proporcional a V, V chamadas recursivas e cada elemento das listas de adjacências inspeccionado uma só vez.

slide-12
SLIDE 12

AED (IST/DEEC) 66

Grafos – Tabelas indexadas por vértices

  • Muitas funções sobre grafos requerem a existência, o uso
  • u construção de tabelas indexadas pelos vértices dos

grafos que processam.

  • Tais tabelas são incluídas em vários níveis de abstracção

– Como variáveis globais – ex: pre em DFS. – Na representação do próprio grafo – ex: grau de um vértice – Como parâmetros passados, fornecidos pelos próprios clientes – ex: ao calcular alguma tabela que seja função dos vértices.

  • A inicialização destas tabelas é tipicamente feita colocando

todas as entradas a –1, por forma a poderem paralelamente ser usadas com a mesma utilidade da tabela pre, atrás apresentada.

AED (IST/DEEC) 67

Grafos - BFS

  • Se o objectivo for encontrar o caminho mais curto entre

um par de vértices, caso exista, a DFS não é muito útil.

  • A DFS poderá

encontrar um caminho, mas não dá garantias de que seja o mais curto, a menos que se determinem todos explicitamente para posterior avaliação.

  • A procura em largura primeiro (“BFS – Breadth First

Search”) é baseada exactamente nesse objectivo.

  • Quando temos mais que uma aresta para percorrer,

escolhemos uma e guardamos as outras para explorar mais tarde.

– Em DFS usamos uma pilha (LIFO) – avança para longe da entrada enquanto puder. – Em BFS usamos um fila (FIFO) – só avança para longe da entrada depois de ter investigado todos corredores que dela saem.

slide-13
SLIDE 13

AED (IST/DEEC) 68

Grafos – Implementação de BFS

(matriz de adjacências)

# define bfs search void bfs(Graph G, Edge e) {int v; QUEUEput(e); while (!QUEUEempty()) if (pre[(e = QUEUEget()).w] == -1) { pre[e.w] = cnt++; st[e.w] = e.v; for (v = 0; v < G->V; v++) if (G->adj[e.w][v] == 1) if (pre[v] == -1) QUEUEput(EDGE(e.w, v)); } } Cria uma fila (FIFO) com todas as arestas incidentes de vértices visitados e de vértices ainda não visitados. Toma a primeira aresta da fila até encontrar uma que aponte para um vértice não visitado. Visita esse vértice, colocando na fila todas as arestas que apontam para vértices não visitados. Tabela st guarda informação sobre o vértice antecessor.

AED (IST/DEEC) 69

Grafos – Exemplo de execução (BFS)

2

slide-14
SLIDE 14

AED (IST/DEEC) 70

Grafos – Exemplo de execução (BFS)

2 5

AED (IST/DEEC) 71

Grafos – Exemplo de execução (BFS)

2 5 7

slide-15
SLIDE 15

AED (IST/DEEC) 72

Grafos – Exemplo de execução (BFS)

6 2 5 7

AED (IST/DEEC) 73

Grafos – Exemplo de execução (BFS)

6 2 3 4 5 7

slide-16
SLIDE 16

AED (IST/DEEC) 74

Grafos – Exemplo de execução (BFS)

6 2 3 4 5 1 7

AED (IST/DEEC) 75

Grafos – Exemplo de execução (BFS)

6 2 3 4 5 1 7

slide-17
SLIDE 17

AED (IST/DEEC) 76

Grafos – Síntese da aula 4

  • Procura em grafos

– Analogia com a exploração de labirintos – Estratégia de Tremaux

  • Procura em profundidade - DFS

– Exemplo de execução – Implementação para matrizes de adjacências e por listas de adjacências – Comparação – Propriedades

  • Procura em largura – BFS

– Implementação por matrizes de adjacências – Exemplo de execução

AED (IST/DEEC) 77

Grafos – Propriedades da BFS (1)

  • Prop: Durante a BFS, os vértices entram e saem da fila

FIFO por ordem crescente da sua distância ao vértice inicial.

  • Demonstração: Verifica-se uma propriedade mais forte: a

fila consiste sempre de zero ou mais vértices distando k passos do vértice inicial, seguidos de zero ou mais vértices distando k+1 passos dos vértice inicial, para algum valor de k.

– É fácil provar esta propriedade por indução.

slide-18
SLIDE 18

AED (IST/DEEC) 78

Grafos – Propriedades da BFS (2)

  • Prop: A BFS visita todos os vértices e arestas de um grafo em

tempo proporcional a V2 para a representação por matriz de adjacências e proporcional a V+E para a representação por listas de adjacências.

  • Demonstração:

– Tal como em DFS, a implementação inspecciona completamente a linha da matriz de adjacências ou a lista de pares adjacentes associada com cada vértice visitado. – Basta mostrar que todos os vértices são visitados. – Todos os vértices que podem ser alcançados a partir do início estão

  • (i) Na árvore criada pela procura, (ii) na fila, ou (iii) são alcançáveis a

partir dos vértices que estão na fila.

  • Todos os vértices se deslocam de (iii) para (ii) e depois para (i), sendo

que em cada iteração do ciclo while (i) aumenta a sua cardinalidade.

AED (IST/DEEC) 79

Grafos – Implementação melhorada de BFS

(matriz de adjacências)

void bfs(Graph G, Edge e) {int v, w; QUEUEput(e); pre[e.w] = cnt++; while (!QUEUEempty()) { e = QUEUEget(); w = e.w; st[w] = e.v; for (v = 0; v < G->V; v++) if ((G->adj[w][v] == 1) && (pre[v] == -1)) { QUEUEput(EDGE(w, v)); pre[v] = cnt++; } } } G u a r d a a p e n a s v é r t i c e s p

  • r

v i s i t a r

slide-19
SLIDE 19

AED (IST/DEEC) 80

Grafos – Problemas que BFS resolve

  • Caminho mais curto entre v e w

– Tomar v como o vértice inicial e aplicar BFS até que pre[w] deixe de ser –1.

  • Caminhos mais curtos a partir de um vértice fonte

– Tomar o vértice fonte como inicial e executar a BFS até ao fim.

  • Todos os caminhos mais curtos

– Como a BFS permite encontrar o caminho mais curto de um vértice inicial para todos os outros, basta aplicar BFS para cada um dos vértices do grafo dado como ponto de partida. – A complexidade desta solução é cúbica no número de vértices para representação por matrizes de adjacências.

AED (IST/DEEC) 81

Grafos – Procura generalizada (1)

  • Tanto a DFS como a BFS são casos particulares de procura

generalizada em grafos.

  • A implementação da BFS que se apresentou, introduz a

pista essencial de resolução de qualquer outro mecanismo de procura.

– Isto é, tudo depende da forma como se inserem novos vértices na fila, assumindo que se retira sempre o vértice que encabeça a fila.

  • Substitua-se o conceito de fila pelo conceito de “franja”,
  • u fronteira.

– Todos os vértices que estão na franja são os não visitados, candidatos à próxima visita.

slide-20
SLIDE 20

AED (IST/DEEC) 82

Grafos – Procura generalizada (GS) (2)

  • Assim sendo, a estratégia genérica de procura em grafos é

a seguinte:

– Tomar um qualquer vértice como inicial e criar a “franja” colocando lá esse vértice. – Enquanto a “franja” não estiver vazia

  • Mover ao longo de uma aresta a partir da “franja”.
  • Se o vértice a que se chega não tiver sido visitado, visitá-lo a colocar

na “franja” todos os vértices não visitados que lhe são adjacentes.

  • Esta estratégia garante que todos os vértices de um grafo

ligado serão visitados.

– Quando usamos uma pilha para modelar a “franja” temos DFS. – Quando usamos uma fila, temos BFS.

AED (IST/DEEC) 83

Grafos – Implementação de procura generalizada

(lista de adjacências)

#define pfs search void pfs(Graph G, Edge e) {link t; int v, w; GQput(e); pre[e.w] = cnt++; while (!GQempty()) { e = GQget(); w = e.w; st[w] = e.v; for (t = G->adj[w]; t != NULL; t = t->next) if (pre[v = t->v] == -1) { GQput(EDGE(w, v)); pre[v] = cnt++;} else if (st[v] == -1) GQupdate(EDGE(w, v)); } }

slide-21
SLIDE 21

AED (IST/DEEC) 84

Grafos – Propriedade da GS

  • Prop:

– Procura generalizada em grafos visita todos os vértices e arestas de um grafo num tempo proporcional a V2 para matrizes de adjacências e proporcional a V+E para listas de adjacências; – mais, no pior caso, o tempo necessário para V inserções, V remoções e E actualizações numa fila generalizada de tamanho V.

  • Demonstração:

– A primeira parte não depende da implementação da fila generalizada, pelo que se aplica trivialmente. – O tempo extra explicitado decorre naturalmente da implementação de uma fila generalizada.

AED (IST/DEEC) 85

Grafos – Árvores mínimas de suporte

  • Def: Uma árvore mínima de suporte (MST) de um grafo

ponderado é o conjunto de arestas ligando todos os vértices, tais que a soma dos pesos das arestas é, pelo menos, tão baixa quanto a soma dos pesos de qualquer

  • utro conjunto de arestas ligando todos os vértices.

– Deverá ser evidente pela definição que estamos apenas interessados em conjuntos de arestas que constituam uma árvore de suporte. – Como se mostra que a definição assim o estabelece?

slide-22
SLIDE 22

AED (IST/DEEC) 86

Grafos – Representação de grafos ponderados (1)

  • A representação dos pesos associados às arestas em grafos

ponderados pode ser feita por:

– A matriz de adjacências deixa de ser booleana, para passar a conter

  • valor associado às arestas – requer sentinela para vértices não

adjacentes. – Cada elemento da lista de adjacências passa a conter um campo adicional com o peso da aresta, para além do campo identificador do vértice. – No caso da representação das arestas ter-se-á que adicionar um campo para o peso.

  • typedef struct {int v, int w, double wt;} Edge;
  • Edge EDGE(int, int, double);
  • Estas definições são incluídas no ficheiro GRAPH.h anteriormente

introduzido.

AED (IST/DEEC) 87

Grafos - Implementação de ADT

(matrizes de adjacência) #include <stdlib.h> #include “GRAPH.h” struct graph {int V; int E; double **adj;}; Graph GRAPHinit(int V) { Graph G = malloc(sizeof (*G)); G->V = V; G->E = 0; G->adj = MATRIXdouble(V, V, maxWT); return G; } void GRAPHinsertE(Graph G, Edge e) { if (G->adj[e.v][e.w] == maxWT) G->E++; G->adj[e.v][e.w] = e.wt; G->adj[e.w][e.v] = e.wt; } G r a f

  • s

P

  • n

d e r a d

  • s
slide-23
SLIDE 23

AED (IST/DEEC) 88

Grafos – Propriedades das MST (1)

  • Prop. 1: Dada uma divisão de vértices de um grafo em dois

conjuntos, qualquer árvore mínima de suporte (MST) desse grafo contém uma aresta de menor peso que liga um vértice de um dos conjuntos a algum dos vértices do outro.

  • Demonstração:

– Por redução ao absurdo. – Suponha-se que não há ou que não é de menor peso. – Se não existir, não é uma árvore de suporte. – Se não for de menor peso, então seja s a aresta de menor peso que liga vértices dos dois conjuntos. Esta aresta não pertence à MST. – Adicione-se a aresta s. O grafo obtido possui agora um ciclo e esse ciclo contém também a aresta t que liga os dois conjuntos. – Retirando a aresta t obtém-se uma MST de menor peso. Não é?

AED (IST/DEEC) 89

Grafos – Exemplo (1)

1 4 2 7 6 5 8 3

G

1 4 2 7 6 5 8 3

G

Aresta mais curta ligando

  • s vértices amarelos aos

verdes.

slide-24
SLIDE 24

AED (IST/DEEC) 90

Grafos – Propriedades das MST (2)

  • Prop. 2: Dado um grafo G, considere-se o grafo G’ que se
  • btém adicionando uma aresta e a G. Adicionar e à MST

de G e retirar a maior aresta do ciclo assim criado, gera a MST de G’.

  • Demonstração:

– Se e é maior que todos as outras arestas do ciclo, não pode pertencer à MST de G’ (ver propriedade anterior): retirando e de tal MST partiria o grafo em dois e e não seria a mais curta aresta entre essas duas partes, porque alguma outra aresta do ciclo faz essa ligação e possui menor peso. – Caso contrário, seja t a maior aresta do ciclo criado com a adição de e. Retirando t à MST original gera duas partes em que todas as restantes arestas são menores que t. – Logo, a menor aresta que liga essas duas partes é a aresta e.

AED (IST/DEEC) 91

Grafos – Exemplo (2)

1 4 2 7 6 5 8 3

G

Nova aresta Ciclo Maior aresta do ciclo

1 4 2 7 6 5 8 3

G

Árvore Mínima de Suporte As arestas que não pertencem à árvore mínima de suporte são as de maior peso em algum ciclo do grafo original.

slide-25
SLIDE 25

AED (IST/DEEC) 92

Grafos – Uma solução para a MST

  • Ideia 1: Construir a árvore mínima de suporte adicionando

arestas, tais que cada aresta adicionada é a de menor peso de todas as que ligam um vértice que já está na árvore a um

  • utro que ainda não esteja.
  • Este método é conhecido como o Algoritmo de

Algoritmo de Prim Prim.

  • Prop: O algoritmo de Prim calcula correctamente a MST.
  • Demonstração: Aplicar a Prop. 1, usando os vértices já na

árvore parcial como o primeiro conjunto e os que não pertencem a essa árvore como o segundo conjunto.

AED (IST/DEEC) 93

Grafos – Outra solução para a MST

  • Ideia 2: Construir a árvore mínima de suporte adicionando

arestas por ordem crescente do seu valor, desde que a nova aresta não forme um ciclo, parando assim que se tiverem adicionado V-1 arestas.

  • Este método é conhecido com o Algoritmo de

Algoritmo de Kruskal Kruskal.

  • Prop: O algoritmo de Kruskal calcula correctamente a MST.
  • Demonstração (esboço):

– Mostra-se por indução que o método constrói uma floresta de sub- MST’s. – Sempre que se adiciona uma aresta que feche um ciclo, só pode ser a maior desse ciclo – Prop. 2. – Caso contrário, a aresta adicionada liga duas árvores e é a menor a fazer essa ligação – Prop. 1.

slide-26
SLIDE 26

AED (IST/DEEC) 94

Grafos – Outra mais...

  • Ideia 3: Começar por ligar cada vértice ao seu vizinho mais

próximo, criando, no máximo, V/2 árvores. Depois, ligar cada árvore à outra árvore que lhe estiver mais próxima. Etc.

  • Este método é conhecido como o Algoritmo de

Algoritmo de Boruvka Boruvka.

  • Prop: O algoritmo de Boruvka calcula correctamente a MST.
  • Demonstração: Cada aresta escolhida é a mais pequena que

liga dois conjuntos disjuntos – Prop. 1.

AED (IST/DEEC) 95

Grafos – Síntese da aula 5

  • Procura em largura

– Propriedades – Implementação alternativa para matrizes de adjacências

  • Procura generalizada em grafos

– Descrição – Implementação – Propriedades

  • Árvores de suporte mínimas – MST

– Representação e implementação de ADT para grafos ponderados – Propriedades das MST’s – exemplos – Propostas de solução para cálculo de MST’s

slide-27
SLIDE 27

AED (IST/DEEC) 96

Grafos – Alg. de Prim (1)

(Implementação)

  • É o algoritmo mais simples de implementar e é a escolha acertada

para grafos densos.

  • Constrói-se a árvore adicionando o vértice que estiver mais próximo

da árvore já construída.

  • A definição do método aponta para uma implementação de força

bruta, que não é aconselhável para que seja eficiente.

  • Através da definição de uma estrutura de dados complementar

adequada é possível evitar cálculos excessivos.

  • Precisamos

– Indicação do vértice pai, para cada vértice já na árvore. – Para cada vértice fora da árvore, indicação de qual o vértice na árvore que lhe está mais próximo. – Para cada vértice fora da árvore, qual a distância ao vértice da árvore mais próximo.

AED (IST/DEEC) 97

Grafos – Alg. de Prim (2)

(Implementação)

  • A implementação mais simples daquele conjunto de dados é

através de uma tabela indexada pelos vértices.

  • Pode-se usar uma estrutura para representar toda a informação

identificada acima. Vamos usar tabelas independentes para maior clareza e generalidade.

  • Para determinar o próximo vértice a adicionar, inspeccionam-se

todos os vértices fora da árvore, usando cada um como um índice para a terceira tabela com o objectivo de determinar a sua distância à árvore e saber qual o mais próximo.

  • Quando se adiciona um vértice, v, examina-se cada uma das

suas arestas v-w, e se w não estiver na árvore actualiza-se a sua distância à árvore, caso v-w tenha um peso inferior à presente distância de w à árvore.

slide-28
SLIDE 28

AED (IST/DEEC) 98

Grafos – Alg. de Prim (3)

(Implementação)

static int fr[maxV]; #define P G->adj[v][w] void GRAPHmstV(Graph G, int st[], double val[]) { int v, w, min; for (v = 0; v < G->V; v++) { st[v] = -1; fr[v] = v; val[v] = maxWT;} min = 0; st[0] = 0; val[G->V] = maxWT; for (v = 0; min != G->V; st[v = min] = fr[v]) for (w = 0, min = G->V; w < G->V; w++) if (st[w] == -1) { if (P < val[w]) { val[w] = P; fr[w] = v;} if (val[w] < val[min]) min = w; } }

fr - frente (franja) provisória de cada nó st - aresta final na MST val - distância pro- visória do nó à MST min - nó à menor distância da MST

AED (IST/DEEC) 99

Grafos – Exemplo de execução (1)

val[*] ← maxWT

Ciclo for interior: v ← 0, st[0] ← 0 0-0 – min ← V st[0] == -1 X ←→ já na árvore 0-1 – adj[0][1] < val[1] val[1] ← 4, fr[1] ← 0 val[1] < val[min] min ← 1 0-2 – adj[0][2] < val[2] X ←→ não adjacentes 0-3 – adj[0][3] < val[3] val[3] ← 3, fr[3] ← 0 val[3] < val[min] min ← 3 0-4;5;6;7 – não adjacentes v ← min, st[3] ← fr[3] 3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

slide-29
SLIDE 29

AED (IST/DEEC) 100

Grafos – Exemplo de execução (2)

Ciclo for interior: v ← min = 3, st[3] ← fr[3] 3-0 – min ← V já na árvore 3-1 – adj[3][1] < val[1] X val[1] < val[min] min ← 1 3-2 – adj[3][2] < val[2] val[2] ← 6, fr[2] ← 3 val[2] < val[min] X 3-3 – já na árvore 3-4 – adj[3][4] < val[4] val[4] ← 2, fr[4] ← 3 val[4] < val[min] min ← 4 3-5;6;7 – não adjacentes v ← min, st[4] ← fr[4] 3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

AED (IST/DEEC) 101

Grafos – Exemplo de execução (3)

3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

slide-30
SLIDE 30

AED (IST/DEEC) 102

Grafos – Alg. de Prim

(Propriedade)

  • Prop: Com o algoritmo de Prim, pode-se determinar a MST de

um grafo denso em tempo linear.

  • Demonstração:

– A simples observação do código permite concluir que o tempo de execução é proporcional a V2, pelo que é linear para grafos densos. – Cada vez que se visita um vértice, uma passagem pelos vértices fora da árvore serve o objectivo duplo de actualizar a distância mínima de cada vértice à árvore e de determinar qual está mais próximo. i.e., qual o próximo a visitar.

  • Descrição:

– Deslocar a aresta mais pequena da franja para a árvore. Visitar o vértice a que conduz e colocar na franja todas as arestas que dele saem para vértices não visitados, substituindo a aresta mais comprida quando duas arestas da franja apontam para o mesmo vértice.

AED (IST/DEEC) 103

Grafos – Alg. de Kruskal (1)

(Implementação)

  • O algoritmo de Prim adiciona uma aresta de cada vez a uma

única árvore em construção.

  • O algoritmo de Kruskal também adiciona uma aresta de cada

vez, mas possui várias pequenas árvores que se vão agregando à medida que a execução evolui.

  • Tem início numa floresta de V árvores – uma por vértice – e

termina quando apenas existe uma árvore – a árvore mínima de suporte.

  • Há que ordenar as arestas com um qualquer algoritmo de
  • rdenação

e posteriormente utilizar um dos algoritmos discutidos para o problema da conectividade.

slide-31
SLIDE 31

AED (IST/DEEC) 104

Grafos – Alg. de Kruskal (2)

(Implementação)

void GRAPHmstE(Graph G, Edge mst[]) { int i, k; Edge a[maxE]; int E = GRAPHedges(a, G); sort(a, 0, E-1); UFinit(G->V); for (i = 0, k = 0; i < E && k < G->V-1; i++) if (!UFfind(a[i].v, a[i].w)) { UFunion(a[i].v, a[i].w); mst[k++] = a[i]; } }

  • 1. Ordenação

do vector de arestas, a. 2.Criação de V conjuntos com um vértice cada.

  • 3. Se

a menor aresta ainda não incluída não ligar dois pares que já estão ligados, in- clui-la na árvore.

AED (IST/DEEC) 105

Grafos – Exemplo de execução (1)

Ordenação das arestas: <(3,4); (2,7); (0,3); (4,6); (0,1); (6,7); (1,3); (2,3); (4,5); (5,6); (2,6)> Partição inicial:

{{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}}

i ← 0; k ← 0 a[i].v = 3; a[i].w = 4

{{0}, {1}, {2}, {3, 4}, {5}, {6}, {7}}

mst[k] ← (3,4) k ← 1 i ← 1 a[i].v = 2; a[i].w = 7

{{0}, {1}, {2, 7}, {3, 4}, {5}, {6}}

mst[k] ← (2,7) k ← 2 3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

slide-32
SLIDE 32

AED (IST/DEEC) 106

Grafos – Exemplo de execução (2)

3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

AED (IST/DEEC) 107

Grafos – Alg. de Kruskal

(Propriedade)

  • Prop: O algoritmo de Kruskal calcula a MST de um grafo

num tempo proporcional a E lg E.

  • Demonstração:

– Esta propriedade é consequência do facto de o tempo de execução incluir uma ordenação de E arestas seguida de E operações procura e V-1 operações de união.

  • PORQUÊ?

– Se utilizarmos os melhores algoritmos para cada uma das

  • perações identificadas, tais como “mergesort” para a ordenação e

procura-união ponderada com “halving” para a conectividade, o custo da ordenação domina.

slide-33
SLIDE 33

AED (IST/DEEC) 108

Grafos – Alg. de Boruvka (1)

(Implementação)

  • Tal como o algoritmo de Kruskal, este algoritmo constrói a

MST adicionando arestas a uma floresta de sub-árvores, todas elas MST’s.

  • A diferença reside no facto de a adição se processar em fases,

em que para cada fase se adicionam várias arestas.

  • Em cada fase determinam-se as arestas mais curtas que ligam

cada sub-árvore com outra.

  • Em seguida adicionam-se todas essas arestas.
  • Mais uma vez, as funções elementares procura e união serão

cruciais para uma implementação eficiente.

AED (IST/DEEC) 109

Grafos – Alg. de Boruvka (2)

(Implementação)

  • Torna-se necessário permitir que a função de procura seja

ligeiramente alterada para que associe um índice com cada uma das sub-árvores.

  • Assim sendo, mantém-se uma tabela indexada por vértices

indicando, para cada sub-árvore, qual a sua vizinha mais próxima.

  • De seguida executam-se as seguintes operações em cada aresta

do grafo:

– Se ligar dois vértices na mesma árvore, ignorá-la. – Caso contrário, verificar as distâncias do vizinho mais próximo de cada uma das árvores, actualizando-se se apropriado.

slide-34
SLIDE 34

AED (IST/DEEC) 110

Grafos – Alg. de Boruvka (3)

(Implementação)

  • Depois de fazer esta avaliação, a tabela dos vizinhos mais

próximos contém a informação necessária para ligar sub- árvores.

  • Para índice dos vértices faz-se uma união, ligando os seus

vizinhos mais próximos.

  • Em seguida, retiram-se as arestas mais longas que ligam outros

pares de vértices nos pares de árvores MST ligadas.

AED (IST/DEEC) 111

Grafos – Alg. de Boruvka (4)

(Implementação)

Edge nn[maxV]; void GRAPHmstE(Graph G, Edge mst[]) { int h, i, j, k, v, w, N; Edge e, a[maxE]; int E = GRAPHedges(a, G); for (UFinit(G->V); E != 0; E = N) { for (k = 0; k < G->V; k++) nn[k] = EDGE(G->V, G->V, 1.0); for (h = 0, N = 0; h < E; h++) { i = find(a[h].v); j = find(a[h].w); if (i == j) continue; if (a[h].wt < nn[i].wt) nn[i] = a[h]; ...

  • 1. Tabela dos vizi-

nhos mais próximos, nn.

  • 2. Criação de tabela

de arestas, a.

  • 3. Inicialização

da distância aos vizi- nhos.

  • 4. Determinação da

sub-árvore a que per- tencem as arestas.

  • 5. Cálculo do vizi-

nho mais próximo.

slide-35
SLIDE 35

AED (IST/DEEC) 112

Grafos – Alg. de Boruvka (5)

(Implementação)

... if (a[h].wt < nn[j].wt) nn[j] = a[h]; a[N++] = a[h]; } for (k = 0; k < G->V; k++) { e = nn[k]; v = e.v; w = e.w; if ((v != G->V) && !UFfind(v, w)) { UFunion(v, w); mst[k] = e; } } } }

  • 5. (continuação)
  • 6. Deita fora de a as

arestas que ligam vértices na mesma sub-árvore!!!

  • 7. Funde duas sub-

árvores, se ainda não associadas, usando a aresta mais curta, e.

AED (IST/DEEC) 113

Grafos – Exemplo de execução (1)

Chamada a GRAPHedges produz a =[(0,1,4);(0,3,3);(1,3,5);(2,3,6);(2,6,7); (2,7,3);(3,4,2);(4,5,6);(4,6,3);(5,6,7); (6,7,4)]; E ← 11 Ciclo for exterior UFinit ↔ [0, 1, 2, 3, 4, 5, 6, 7] Primeiro ciclo for produz nn ← [8 vezes (8,8,7)] (custos não normalizados) Segundo ciclo for h ← 0; N ← 0 i ← 0; j ← 1 (diferentes conjuntos) a[h].wt < nn[i].wt nn[0] ← (0,1,4) a[h].wt < nn[j].wt nn[1] ← (0,1,4) a[N] ← a[h]; N ← 1 h ← 1 3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

slide-36
SLIDE 36

AED (IST/DEEC) 114

Grafos – Exemplo de execução (2)

h ← 1 i ← 0; j ← 3 (diferentes conjuntos) a[h].wt < nn[i].wt nn[0] ←(0,3,3) a[h].wt < nn[j].wt nn[j] ←(0,3,3) a[N] ← a[h]; N ← 2 h ← 2 i ← 1; j ← 3 (diferentes conjuntos) a[h].wt < nn[i].wt X a[h].wt < nn[j].wt X a[N] ← a[h]; N ← 3 ... No final do segundo ciclo for tem-se nn = [ (0,3,3);(0,1,4);(2,7,3);(3,4,2); (3,4,2);(4,5,6);(4,6,3);(2,7,3)] N = 11; 3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

AED (IST/DEEC) 115

Grafos – Exemplo de execução (3)

Terceiro ciclo for k ← 0 e ← nn[k]; v ← 0; w ← 3 v != 8 && !UFfind(0,3) UFunion(0,3); mst[k] ← (0,3,3) k ← 1 e ← nn[k]; v ← 0; w ← 1 v != 8 && !UFfind(0,1) UFunion(0,1); mst[k] ← (0,1,4) k ← 2 e ← nn[k]; v ← 2; w ← 7 v != 8 && !UFfind(2,7) UFunion(2,7); mst[k] ← (2,7,3) k ← 3 e ← nn[k]; v ← 3; w ← 4 v != 8 && !UFfind(3,4) UFunion(3,4); mst[k] ← (3,4,2) 3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

slide-37
SLIDE 37

AED (IST/DEEC) 116

Grafos – Exemplo de execução (4)

k ← 4 e ← nn[k]; v ← 3; w ← 4 v != 8 && !UFfind(3,4) X k ← 5 e ← nn[k]; v ← 4; w ← 5 v != 8 && !UFfind(4,5) UFunion(4,5); mst[k] ← (4,5,6) k ← 6 e ← nn[k]; v ← 4; w ← 6 v != 8 && !UFfind(4,6) UFunion(4,6); mst[k] ← (4,6,3) k ← 7 e ← nn[k]; v ← 2; w ← 7 v != 8 && !UFfind(2,7) X Fim do 3º ciclo for - Retorno ao ciclo for externo 3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

AED (IST/DEEC) 117

Grafos – Exemplo de execução (5)

3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

No final desta iteração existem 2 sub-árvores Sejam 1* e 2* os seus identificadores E ← N == 11 Primeiro ciclo for produz nn ← [8 vezes (8,8,7)] (custos não normalizados) Segundo ciclo for N ← 0 h ← 0; i ← 1*; j ← 1* (mesmo conjunto) h ← 1: i ← 1*; j ← 1* (mesmo conjunto) h ← 2: i ← 1*; j ← 1* (mesmo conjunto) h ← 3: i ← 2*; j ← 1* (diferentes conjuntos) a[h].wt < nn[i].wt nn[2*] ←(2,3,6) a[h].wt < nn[j].wt nn[1*] ←(2,3,6) a[N] ← a[h]; N ← 1 (arestas fora...)

slide-38
SLIDE 38

AED (IST/DEEC) 118

Grafos – Exemplo de execução (6)

3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

h ← 4: i ← 2*; j ← 1* (diferentes conjuntos) a[h].wt < nn[i].wt X a[h].wt < nn[j].wt X a[N] ← a[h]; N ← 2 h ← 5: i ← 2*; j ← 2* (mesmo conjunto) h ← 6: i ← 1*; j ← 1* (mesmo conjunto) h ← 7: i ← 1*; j ← 1* (mesmo conjunto) h ← 8: i ← 1*; j ← 1* (mesmo conjunto) h ← 9: i ← 1*; j ← 1* (mesmo conjunto) h ← 10: i ← 1*; j ← 2* (diferentes conjuntos) a[h].wt < nn[i].wt nn[1*] ← (6,7,4) a[h].wt < nn[j].wt nn[2*] ← (6,7,4) a[N] ← a[h]; N ← 3

AED (IST/DEEC) 119

Grafos – Exemplo de execução (7)

3 1 6 5 4 7 2

G

3 4 5 2 6 6 7 3 7 3 4

No final do segundo ciclo for tem-se nn = [ 6 vezes (8,8,7) e 2 vezes (6,7,4)] Porquê?... a = [(2,3,6);(2,6,7);(6,7,4); ...] Porquê? N = 3 Terceiro ciclo for k ← para alguns valores e ← nn[k]; v ← 8; w ← 8 v != 8 && !UFfind(0,3) X ... k ← para outro – qual? e ← nn[k]; v ← 6; w ← 7 v != 8 && !UFfind(6,7) UFunion(6,7); mst[k] ← (6,7,4) ...

slide-39
SLIDE 39

AED (IST/DEEC) 120

Grafos – Alg. de Boruvka

(Propriedade)

  • Prop: O algoritmo de Boruvka calcula a MST de um grafo num

tempo inferior a E lg V lg* V.

  • Demonstração:

– Dado que o número de sub-árvores na floresta se reduz, pelo menos, a metade em cada fase, o número de fases não é maior que lg V. – O tempo de cada fase é, no máximo, proporcional ao custo de E

  • perações de procura.
  • Observações:

– A expressão acima é bastante conservadora, na medida em que ignora a redução de arestas ocorrida em cada fase. – Concebido em 1926 e desde os anos 80 a base para o desenvolvimento de algoritmos eficientes para MST’s, assim como para algoritmos paralelos

AED (IST/DEEC) 121

Grafos – Comparação dos métodos (1)

Algoritmo Pior caso Comentário Prim (padrão) V2 Óptimo para grafos densos Prim (com PFS)* E lg V Pior caso conservador Kruskal (padrão) E lg E Custo de ordenação domina Kruskal (ord. parcial)* E + X lg V Depende da aresta maior Boruvka E lg V Pior caso muito conservador * Variantes não discutidas

* PFS – Priority-First Search * ord. parcial – evitar ordenar todas as arestas, dado que podem não ser necessárias (via heapsort, por exemplo).

slide-40
SLIDE 40

AED (IST/DEEC) 122

Grafos – Comparação dos métodos (2)

E V H P K K* e/E B e/E Densidade - 2 20000 10000 22 9 11 1.00 14 3.30 50000 25000 69 24 31 1.00 38 3.30 100000 50000 169 49 66 1.00 89 3.80 200000 100000 389 108 142 1.00 189 3.60 Densidade - 20 20000 1000 5 20 6 5 0.20 9 4.20 50000 2500 12 130 16 15 0.28 25 4.60 100000 5000 27 34 31 0.30 55 4.60 200000 10000 61 73 68 0.35 123 5.00 Densidade - 100 100000 1000 17 24 30 19 0.06 51 4.60 250000 2500 44 130 81 53 0.05 143 5.20 500000 5000 93 181 113 0.06 312 5.50 1000000 10000 204 377 218 0.06 658 5.60 Densidade - V/2.5 400000 1000 60 20 137 78 0.02 188 4.50 2500000 2500 409 128 1056 687 0.01 1472 5.50 H Prim - listas de adjacências/heapsort K* Kruskal com ordenação parcial P Prim - matriz de adjacências B Boruvka K Kruskal e/E Arestas examinadas (uniões)

AED (IST/DEEC) 123

Grafos – Síntese da aula 6

  • Algoritmo de Prim

– Descrição – Implementação – Exemplo de execução – Análise de eficiência

  • Algoritmo de Kruskal

– Descrição – Implementação – Exemplo de execução – Análise de eficiência

  • Algoritmo de Boruvka

– Descrição; Implementação; Exemplo de execução; Análise de eficiência

  • Comparação dos três métodos