AED Algoritmos e Estruturas de Dados LEEC - 2006/2007 Teoria de Grafos e Algoritmos em Grafos
Grafos - O que é um grafo? • Objecto abstracto • Dois tipos de entidades – Nós ou Vértices – Ra mos ou A restas
• Vértices representam – cidades, pessoas, máquinas, números, etc
• Arestas representam – existência de ligações entre nós, valor da ligação entre nós, distância entre nós, etc
A ED (IST/DE EC)
2
Grafos - Motivação • Mapas
• Emparelhamento
– caminhos mais curtos; caminhos mais baratos.
• Circuitos Eléctricos – existência de curto-circuitos; existência de cruza mento entre ligações.
• Sequenciamento – tarefas a executar por um conjunto de recursos sujeitas a restrições de carácter tecnológico.
– processame nto de imagem estéreo; atribuição de pessoas a lugares.
• Redes de dados – comp utadores ligados entre si, enviando e recebendo mensagens; existência de ligação entre quaisq uer nós; redundância.
• Estrutura de Programas – grafos gerados por compiladores representando a estrutura de chamadas;
A ED (IST/DE EC)
3
Grafos – Definições (1) • Def: Um grafo é um conjunto de vértices e um conjunto de arestas que ligam pares de vértices distintos (com nunca mais que uma aresta a ligar qualquer par de vértices). • Def: Dois vértices ligados por uma aresta dizem-se adjacentes. • Def: Uma aresta que ligue dois vértices diz-se incidente de cada um dos vértices.
A ED (IST/DE EC)
4
Grafos – Definições (2) • Def: O número de arestas incidentes num vértice diz-se o grau desse vértice. • Def: O subconjunto de arestas e vértices a elas associados diz-se um sub-grafo do grafo original. • Def: Uma sequência de vértices na qual os vértices sucessivos estão ligados por arestas do grafo diz-se um cam inho.
A ED (IST/DE EC)
5
Grafos – Definições (3) • Def: Num caminho simples os vértices e arestas são distintos. • Def: Um caminho em que todos os vértices e arestas são distintos, excepto para o primeiro e último que são iguais, diz-se um ciclo. • Def: Dois caminhos simples dizem-se disjuntos se não possuírem vértices comu ns, excepto possivelmente para os vértices extremos. A ED (IST/DE EC)
6
Grafos – Definições (4) • Def: Um grafo diz-se ligado se existir um caminho de cada vértice para todos os outros vértices do grafo. • Def: Um grafo que não seja ligado é constituído por componentes ligadas, que se dizem sub-grafos ligados máximos. • Def: Um grafo ligado acíclico, i.e. sem ciclos, diz-se uma árvore.
A ED (IST/DE EC)
7
Grafos – Definições (5) • Def: Um conjunto de árvores diz-se uma floresta. • Def: A árvore de suporte de um grafo ligado é um sub-grafo que contém todos os vértices e é uma árvore. • A floresta de suporte de um grafo é um sub-grafo que contém todos os seus vértices e é uma floresta.
A ED (IST/DE EC)
8
Grafos – Propriedades em árvores • Um grafo G de V vértices é uma árvore se e só se satisfizer qualquer das seguintes condições: – G tem V-1 arestas e nenhum ciclo. – G tem V-1 arestas e é ligado. – Existe apenas um caminho simples a unir quaisq uer dois vértices. – G é ligado mas retirando uma só aresta faz com que deixe de o ser.
A ED (IST/DE EC)
9
Grafos – Exemplos (1) G 1
2
4
6
3
5
8
7
• Os vértices 6 e 7 são adjacentes. • Os vértices 4 e 6 não são adjacentes. • O vértice 7 tem grau quatro.
A ED (IST/DE EC)
10
Grafos – Exemplos (2) G’ 1
2
4
3
5
6
• • • •
8
7
G’ é um sub-grafo de G, gerado a partir das arestas a cheio. O vértice 5 não pertence a G’. G é um grafo ligado; G’ não é. O sub-grafo G’ é constituído por um grafo completo com três vértices e por uma árvore com quatro vértices
A ED (IST/DE EC)
11
Grafos – Exemplos (3) G 1
2
4
6
3
5
8
7
• Caminho: 1-2-4-5-7-8
A ED (IST/DE EC)
12
Grafos – Exemplos (4) G 1
2
4
3
5
6
8
7
• Ciclo: 3-4-5-6-7-8-3
A ED (IST/DE EC)
13
Grafos – Exemplos (5) G’’ 1
2
4
6
3
5
8
7
• G’’: árvore de suporte de G.
A ED (IST/DE EC)
14
Grafos – Síntese da Aula 1 • Introdução – Definição de grafo – Motivação aplicacional
• Definições e notação • Propriedades elementares em grafos • Exemplos
A ED (IST/DE EC)
15
Grafos - Definições e Propriedades (1) • Def: Um grafo diz-se completo quando existe uma aresta ligando qualquer par de vértices. • Prop: Um grafo com V vértices possui, no máximo, V(V-1)/2 arestas. • Def: Um grafo G’ diz-se com plemento do grafo G quando se obtém a partir de um grafo completo com o mesmo número de vértices de G, retirando-lhe todas as arestas de G.
A ED (IST/DE EC)
16
Grafos - Definições e Propriedades (2) • Def: Um grafo que possua um número de arestas próximo do número máximo diz-se denso. • Def: Um grafo cujo complemento seja denso diz-se esparso. • Def: D ensidade de um grafo: 2E/V, em que E é o número de arestas e V o de vértices. • Def: A um sub-grafo completo dá-se o nome de clique.
A ED (IST/DE EC)
17
Grafos - Definições e Propriedades (3) • Def: Um grafo que possua a propriedade de ser possível dividir os vértices em dois conjuntos tais que todas as arestas apenas ligam vértices de um conjunto a vértices do outro conjunto diz-se bipartido. • Def: Quando existe um sentido atribuído às arestas, os grafos dizem-se direccionados, dirigidos ou digrafos. • Def: O primeiro vértice de uma aresta direccionada diz-se fonte e o segundo diz-se destino. A ED (IST/DE EC)
18
Grafos - Definições e Propriedades (4) • Prop: Apenas os vértices destino são adjacentes dos vértices fonte. • Def: Um ciclo direccionado num digrafo é um ciclo em que todos os pares de vértices adjacentes surgem pela ordem especificada pelas arestas. • Def: Um digrafo sem ciclos direccionados diz-se grafo direccionado acíclico, ou DAG (Directed Acyclic Graph).
A ED (IST/DE EC)
19
Grafos - Definições e Propriedades (5) • Def: Quando se atribuem pesos às arestas, representando custo, distância, etc., diz-se que o grafo é ponderado. – Também é possível atribuir pesos aos próprios vértices, ou a pares vértice/aresta.
• Def: Grafos ponderados direccionados, dizem-se redes.
A ED (IST/DE EC)
20
Grafos - Interface ADT para Grafos (1) • Os algoritmos para processamento de grafos serão desenvolvidos no contexto de uma ADT que define as tarefas de interesse. • A nossa primeira interface elementar é tal que: – O número de vértices e arestas são especificados por inteiros; – Uma aresta é definida por um par de inteiros, designando os vértices que une; – O número de vértices é limitado superiormente. • Esta interface irá sendo alargada à medida das necessidades.
A ED (IST/DE EC)
21
Grafos - Interface ADT para Grafos (2) typedef struct {int v; int w;} Edge; Edge EDGE(int, int); typedef struct graph *Graph; Graph GRAPHinit(int); void GRAPHinsertE(Graph, Edge); void GRAPHremoveE(Graph, Edge); int GRAPHedges(Edge a[], Graph G); Graph GRAPHcopy(Graph); void GRAPHdestroy(Graph);
A ED (IST/DE EC)
Graphinit cria grafo com
o número final de vértices, sem arestas. GraphinsertE insere uma aresta, caso não exista. GraphremoveE retira uma aresta, caso exista. Graphedges conta o número de arestas. Graphcopy cria uma segunda cópia do grafo. Graphdestroy faz o inverso de Graphinit. 22
Grafos - Matriz de Adjacências (1) • Matriz de Adjacências
– Matriz (V×V) de valores booleanos; – A entrada correspondente à linha v e coluna w é 1 se existir uma aresta ligando estes dois vértices; – A mesma entrada vale 0 caso contrário; – A matriz é simétrica, excepto para digrafos, em que poderá não sê-lo.
A ED (IST/DE EC)
23
Grafos - Matriz de Adjacências (2) • Grafo
• Matriz
G 1
2
4
6
3
5
8
7
1 2 3 4 5 6 7 8
1 1 1 0 1 0 0 0 0
2 1 1 0 1 0 0 0 0
3 0 0 1 1 0 0 1 1
4 1 1 1 1 1 0 0 0
5 0 0 0 1 1 1 1 0
6 0 0 0 0 1 1 1 0
7 0 0 1 0 1 1 1 1
8 0 0 1 0 0 0 1 1
Matriz V ×V simétrica
A ED (IST/DE EC)
24
Grafos - Implementação de ADT (1) #in clu de #in clu de “G RA PH. h” str uct g rap h {in t V; int E; i nt ** adj;} ; Gra ph GR APH in it( in t V ){ Gr aph G = ma llo c( siz eof (st ru ct gr aph)) ; G->V = V; G->E = 0; G->adj = MA TR IXi nt (V, V, 0); re tur n G; } voi d G RA PHi ns ert E( Gra ph G, Ed ge e) { in t v = e. v, w = e.w; if (G->a dj[ v][w] == 0) G->E ++ ; G->adj [v][w] = 1; G->adj [w][v] = 1; } A ED (IST/DE EC)
25
Grafos - Implementação de ADT (2) voi d G RA PHr em ove E( Gra ph G, Ed ge e) { in t v = e. v, w = e.w; if (G->a dj[ v][w] == 1) G->E--; G->adj [v][w] = 0; G->adj [w][v] = 0; } int GR AP Hed ge s(E dg e a [], Gr ap h G ){ in t v, w, E = 0; for (v = 0; v < G->V; v++) for (w = v+1; w < G->V; w++) if (G->a dj[ v][w] == 1) a[E++] = ED GE (v, w); ret urn E ; } A ED (IST/DE EC)
26
Grafos – Síntese da Aula 2 • Definições e propriedades – Grafos completos, complemento de um grafo, densidade, cliques, grafos bipartidos, grafos direccionados, ciclos em grafos direccionados, grafos ponderados, redes.
• Estrutura abstracta de dados para grafos – Interface elementar
• Matrizes de adjacência – Representação de um grafo – Implementação da estrutura abstracta de dados
A ED (IST/DE EC)
27
Grafos - Listas de Adjacências (1) • Listas de Adjacências – Cada vértice possui uma lista ligada; – Os elementos constituintes da lista de um vértice são os seus vértices adjacentes; – Em grafos simples, se os vértices v e w são adjacentes, então w pertence à lista de v e v pertence à lista de w .
A ED (IST/DE EC)
28
Grafos - Listas de Adjacências (2) • Listas de Adjacências
• Grafo G 1
2
4
6
3
5
8
7
1 2 3 4 5 6 7 8
4 1 4 3 4 5 5 3
2 4 8 1 6 7 3 7
7 2 7
5
6
8
Tabela com V listas de arestas A ED (IST/DE EC)
29
Grafos - Implementação de ADT (1) #include #include “GRAPH.h” typedef struct node *link; struct node {int v; link next;}; struct graph{int V; int E; link *adj;};
link NEW(int v, link next){ link x = malloc(sizeof(struct node)); x->v = v; x ->next = next; return x; } A ED (IST/DE EC)
30
Grafos - Implementação de ADT (2) Graph GRAPHinit(int V)} int v; Graph G = malloc(sizeof(struct graph)); G->V = V; G->E = 0; G->adj = malloc(V * sizeof(link)); for (v = 0; v < V; v++) G->adj[v] = NULL; return G;} void GRAPHinsertE(Graph G, Edge e){ int v = e.v, w = e.w; G->adj[v] = NEW(w, G->adj[v]); G->adj[w] = NEW(v, G->adj[w]); G->E++;} A ED (IST/DE EC)
31
Grafos - Implementação de ADT (3) void GRAPHremoveE(Graph G, Edge e){ /* Fica como exercício */ } int GRAPHedges(Edge a[], Graph G){ int v, E = 0; link t; for (v = 0; v < G->V; v++) for (t = G->adj[v]; t != NULL; t = t->next) if (v < t->v ) a[E++] = EDGE(v, t->v); return E; }
A ED (IST/DE EC)
32
Grafos - Vantagens das M. de Adj. • Representação de eleição quando – há espaço disponível; – os grafos são densos; – os algoritmos requerem mais que V 2 operações.
• Adição e remoção de arestas é feita de forma eficiente; • É fácil evitar a existência de arestas paralelas; • É fácil determinar se dois vértices estão ou não ligados. A ED (IST/DE EC)
33
Grafos - Inconvenientes das M. de Adj. • Grafos esparsos de grande dimensão requerem espaço de memória proporcional a V 2; • Neste casos, a simples inicialização do grafo (proporcional a V 2 ) pode ser do-minante na execução global do algoritmo; • Pode nem sequer armazenar a matriz.
A ED (IST/DE EC)
existir
memória
suficiente
para
34
Grafos - Vantagens das L. de Adj. • Inicialização é proporcional a V. • Utiliza sempre espaço proporcional a V+E – adequado para grafos esparsos. – algoritmos que assentem na análise de arestas em grafos esparsos.
• Adição de arestas é feita de forma eficiente.
A ED (IST/DE EC)
35
Grafos - Inconvenientes das L. de Adj. • Arestas paralelas e adjacência entre vértices – requer que se pesquise as listas de adjacências, o que pode levar um tempo proporcional a V.
• Remoção de arestas – pode levar um tempo proporcional a V (este problema pode ser contornado).
• Não aconselhável para – grafos de grande dimensão que não podem ter arestas paralelas; – grande utilização de remoção de arestas.
A ED (IST/DE EC)
36
Grafos - Variantes e Extensões (1) • Outros tipos de grafos – Digrafos • ambas facilmente extensíveis; • arestas representadas só uma vez;
– Grafos ponderados e redes • M. de Adj. preenchida com pesos; • L. De Adj. com campos extra para representação dos pesos.
A ED (IST/DE EC)
37
Grafos - Variantes e Extensões (2) • Alteração da estrutura de dados – Tipo “EDGE” contendo informação adicional, para além dos vértices que liga. – Vectores indexados pelos vértices • Manute nção da informação do grau do vértice.
– Vector de arestas • Forma alternativa de representação de grafos.
A ED (IST/DE EC)
38
Grafos - Representações alternativas • Três mecanismos básicos de representação de grafos – Vector de arestas; – Matriz de adjacências; – Listas de adjacências. • Produzem diferentes desempenhos ao nível das operações de manipulação. • Escolha deverá depender do problema a resolver.
A ED (IST/DE EC)
39
Grafos – Desempenho Relativo Espaço
V. de Arestas M. de Adj. V2 E
L. de Adj. V+E
Inicialização
1
V2
V
Cópia
E
V2
E
Destruição
1
V
E
Inserir aresta
1
1
1
Encontrar aresta
E
1
V
Remover aresta
E
1
V
Vértice isolado?
E
V
1
Caminho de u a v?
Elg*V
V2
E
A ED (IST/DE EC)
40
Grafos - Encontrar e remover arestas (1) • Eficientes em representações por matriz de adjacências. • Como torná-las eficientes para as outras representações? • Atribuir um símbolo inteiro a cada aresta – Aresta v-w fica com o símbolo v*V+w. • Por exemplo, fazer uso de tabelas de dispersão (“hashtables”) • Quando uma aresta é inserida, é fácil testar se o símbolo já foi usado. A ED (IST/DE EC)
41
Grafos - Encontrar e remover arestas (2) • Remoção em digrafos – ponteiro na tabela de dispersão para a sua representação na lista de adjacências; – requer listas duplamente ligadas.
• Remoção em grafos simples – colocação de ambos os ponteiros na tabela de dispersão; – ou ponteiro entre os vértices.
A ED (IST/DE EC)
42
Grafos – Síntese da Aula 3 • Listas de adjacência – Representação de um grafo – Implementação da estrutura abstracta de dados
• Comparação das representações alternativas – Vantagens e inconvenientes das matrizes de adjacência – Vantagens e inconvenientes das listas de adjacência
• Variantes e extensões – Grafos direccionados, ponderados e redes – Outras representações
• Comparação das representações alternativas – Memória e tempo de execução A ED (IST/DE EC)
43