Grafos
Bruno Merlin
Introdução a grafos
Introdução a grafos
Terminologia
a
b
d
e
c
f
Vértice / Nó
Aresta
Grau / Valência: número de aresta que incidem de um nó
Adjacente/vizinho: No alcançado a partir de um nó via uma aresta
Passeio: sequência alternada de nós e arestas
Caminho: sequência de vértice tal que cada nó sucessivo do caminho é separado por
uma aresta
Caminho simples: caminho que não contém nenhum nó repetido
Comprimento do caminho: número de arestas do caminho (numero de vértices - 1)
Terminologia
a
b
d
e
c
f
Vértice / Nó
Aresta
Caminho euleriano: caminho que passa por todas as arestas apenas uma vez
Caminho hamiltoniano: caminho que passa por todos os nós apenas uma vez
Ciclo: caminho que inicia e termina com o mesmo nó
Ciclo euleriano: caminho euleriano que inicia e termina com o mesmo nó
Ciclo hamiltoniano: caminho hamiltoniano que inicia e termina com o mesmo nó
Grafos orientados/direcionados
a
b
d
e
c
f
As arestas juntam dois nós e um sentido único
Grafos ponderados / com peso
a
b
d
e
c
f
2
3
5 6
4
3
2
O comprimento de cada aresta é ponderado por um peso
No caso do não ponderado o comprimento de cada aresta é 1
4 famílias de grafos
Não ponderado Ponderado
Não orientado
Orientado
3
3
Terminologia
• Grafo completo: para cada nó existe
uma aresta relacionando o nó com
todos os outros nós
• Grafo conexo: sempre existe um
caminho entre dois nós
• Ponto de articulação: nó cuja
remoção divide o grafo conexos em
dois sub-grafos isolados
• As árvores são grafos acíclicos
Representação na mémoria
• Lista de adjacência:
– Um nó memoriza a lista de todas as arestas incidentes
– Uma aresta tem um peso e uma referência do nó
vizinho
• Matriz de adjacência/incidência:
– Ambas colunas e linhas da matriz representam a lista
dos nós do grafo
– matriz [i][j] memoriza o peso da aresta do nó i para o
nó j, -1 (ou outro valor simbólico caso o peso possa ser
negativo) caso está aresta não exista
Lista de adjacência
class No {
String identificador;
ArrayList <Aresta> adjacentes;
}
class Aresta {
int peso
No vizinho;
}
class Grafo {
ArrayList <No> nos;
}
grafo
A
C
F
K
2 C 3 K
2 A 5 K
2 A
2 A 4 F
Lista de adjacência
class No {
String identificador;
ArrayList <Aresta> arestas;
}
class Aresta {
int peso
No vizinho;
}
class Grafo {
ArrayList <No> nos;
}
grafo
A
C
F
K
2 C 3 K
2 A 5 K
2 A
2 A 4 F
A
C
F
K
2
2 3
5
2
2
4
Matriz de adjacência
class No {
String identificador;
}
class Grafo {
ArrayList <No> nos;
int [][] pesos;
}
0 2 -1 3
2 0 -1 5
2 -1 0 -1
2 -1 4 0
A C F K
A
C
F
K
A
C
F
K
2
2 3
5
2
2
4
grafo
A
C
F
K
Representação na mémoria
• Qual representação escolher?
– As estruturas de dados usadas na matriz de
adjacência são mais leves, porém o peso (-1)
precisa ser memorizado para as arestas que não
existem
⇒ A matriz de adjacência é melhor para os grafos
completos ou perto de ser completos
⇒ A lista de adjacência é melhor nas outras
situações
Percursos em Grafos
• Os tipos de percurso em grafos (percurso em
largura ou profundidade) são parecidos com
os percursos em árvore, porem:
– O grafo não contém raiz ⇒ o percurso pode iniciar
a partir de qualquer nó
– O grafo pode conter ciclos ⇒ precisamos garantir
que cada nó será alcançado apenas uma vez
durante o percurso ou o algoritmo pode entrar em
loop infinito
Percurso em profundidade
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
class No {
String identificador;
ArrayList <Aresta> arestas;
boolean explorado;
}
class Aresta {
int peso
No vizinho;
}
class Grafo {
ArrayList <No> nos;
}
e
f
Percurso em profundidade
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
e
f
Explorar: tratar o nó (imprimir por exemplo), marcar o nó,
e explorar os vizininhos não marcados
Saída: a
Percurso em profundidade
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
e
f
Explorar: tratar o nó (imprimir por exemplo), marcar o nó,
e explorar os vizininhos não marcados
Saída: a - b
Percurso em profundidade
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
e
f
Explorar: tratar o nó (imprimir por exemplo), marcar o nó,
e explorar os vizininhos não marcados
Saída: a
Saída: a – b - d
Percurso em profundidade
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
e
f
Explorar: tratar o nó (imprimir por exemplo), marcar o nó,
e explorar os vizininhos não marcados
Saída: a – b – d - e
Percurso em profundidade
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
e
f
Explorar: tratar o nó (imprimir por exemplo), marcar o nó,
e explorar os vizininhos não marcados
Saída: a – b – d – e - g
Percurso em profundidade
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
e
f
Explorar: tratar o nó (imprimir por exemplo), marcar o nó,
e explorar os vizininhos não marcados
Saída: a – b – d – e - g
Percurso em profundidade
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
e
f
Explorar: tratar o nó (imprimir por exemplo), marcar o nó,
e explorar os vizininhos não marcados
Saída: a – b – d – e – g - f
Percurso em profundidade
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
e
f
Explorar: tratar o nó (imprimir por exemplo), marcar o nó,
e explorar os vizininhos não marcados
Saída: a – b – d – e – g - f
Percurso em profundidade
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
e
f
Explorar: tratar o nó (imprimir por exemplo), marcar o nó,
e explorar os vizininhos não marcados
Saída: a – b – d – e – g - f
Percurso em profundidade
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
e
f
Explorar: tratar o nó (imprimir por exemplo), marcar o nó,
e explorar os vizininhos não marcados
Saída: a – b – d – e – g - f
Percurso em profundidade
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
e
f
Explorar: tratar o nó (imprimir por exemplo), marcar o nó,
e explorar os vizininhos não marcados
Saída: a – b – d – e – g - f
Percurso em profundidade
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
e
f
Explorar: tratar o nó (imprimir por exemplo), marcar o nó,
e explorar os vizininhos não marcados
Saída: a – b – d – e – g – f - c
Percurso em profundidade
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
e
f
Explorar: tratar o nó (imprimir por exemplo), marcar o nó,
e explorar os vizinhos não marcados
Saída: a – b – d – e – g – f - c
Percurso em profundidade
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
e
f
Saída: a – b – d – e – g – f - c
Percurso em largura
Percurso em largura
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
f
Introduzir o primeiro na fila
Enquanto houver nó na fila
Remover o primeiro nó da fila,
Se o nó não for marcado,
marcar ele,
imprimir ele
inserir os adjacentes não marcados na fila
a
Fila
Percurso em largura
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
f
Introduzir o primeiro na fila
Enquanto houver nó na fila
Remover o primeiro nó da fila,
Se o nó não for marcado,
marcar ele,
imprimir ele
inserir os adjacentes não marcados na fila
b
Fila
c
a
Saída: a
Percurso em largura
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
f
Introduzir o primeiro na fila
Enquanto houver nó na fila
Remover o primeiro nó da fila,
Se o nó não for marcado,
marcar ele,
imprimir ele
inserir os adjacentes não marcados na fila
c
Fila
d
b
e
Saída: a – b
Percurso em largura
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
f
Introduzir o primeiro na fila
Enquanto houver nó na fila
Remover o primeiro nó da fila,
Se o nó não for marcado,
marcar ele,
imprimir ele
inserir os adjacentes não marcados na fila
d
Fila
e
c
f
Saída: a – b – c
Percurso em largura
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
f
Introduzir o primeiro na fila
Enquanto houver nó na fila
Remover o primeiro nó da fila,
Se o nó não for marcado,
marcar ele,
imprimir ele
inserir os adjacentes não marcados na fila
e
Fila
f
d
e
g
Saída: a – b – c – d
Percurso em largura
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
f
Introduzir o primeiro na fila
Enquanto houver nó na fila
Remover o primeiro nó da fila,
Se o nó não for marcado,
marcar ele,
imprimir ele
inserir os adjacentes não marcados na fila
f
Fila
e
e
g
g
f
Saída: a – b – c – d – e
Percurso em largura
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
f
Introduzir o primeiro na fila
Enquanto houver nó na fila
Remover o primeiro nó da fila,
Se o nó não for marcado,
marcar ele,
imprimir ele
inserir os adjacentes não marcados na fila
Fila
e f
g
g
f
g
Saída: a – b – c – d – e – f
Percurso em largura
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
f
Introduzir o primeiro na fila
Enquanto houver nó na fila
Remover o primeiro nó da fila,
Se o nó não for marcado,
marcar ele,
imprimir ele
inserir os adjacentes não marcados na fila
Fila
e
g
g
f
g
Saída: a – b – c – d – e – f
Percurso em largura
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
f
Introduzir o primeiro na fila
Enquanto houver nó na fila
Remover o primeiro nó da fila,
Se o nó não for marcado,
marcar ele,
imprimir ele
inserir os adjacentes não marcados na fila
Fila
g
g
f
g
Saída: a – b – c – d – e – f – g
Percurso em largura
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
f
Introduzir o primeiro na fila
Enquanto houver nó na fila
Remover o primeiro nó da fila,
Se o nó não for marcado,
marcar ele,
imprimir ele
inserir os adjacentes não marcados na fila
Fila
g
f
g
Saída: a – b – c – d – e – f – g
Percurso em largura
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
f
Introduzir o primeiro na fila
Enquanto houver nó na fila
Remover o primeiro nó da fila,
Se o nó não for marcado,
marcar ele,
imprimir ele
inserir os adjacentes não marcados na fila
Fila
f
g
Saída: a – b – c – d – e – f – g
Percurso em largura
a
b
c
d
e
f
g
a
b
c
d
e
f
g
b c
d e
f
e g
g
b
f
Introduzir o primeiro na fila
Enquanto houver nó na fila
Remover o primeiro nó da fila,
Se o nó não for marcado,
marcar ele,
imprimir ele
inserir os adjacentes não marcados na fila
Fila
g
Saída: a – b – c – d – e – f – g
Melhor caminho: Dijkstra
Melhor caminho: Dijkstra
a
b
c
d
e
f
g
2
4
3
5
1
3
1
1
2
4
3
a b c d e f g
a,0 ∞ ∞ ∞ ∞ ∞ ∞
Melhor caminho de a a g?
Todas as distâncias de a até os outros elementos
São inicializadas a ∞ (tirando a distancia de a para a)
2
Melhor caminho: Dijkstra
a
b
c
d
e
f
g
2
4
3
5
1
3
1
1
2
4
3
a b c d e f g
a,0 a,2 a,3 ∞ a,4 ∞ ∞
Melhor caminho de a a g?
Saindo de do nó de menor caminho não marcado (a) posso alcançar b,
aumentando o custo de 2, c aumentando o custo de 3 e e aumentando o custo de
4
2
Melhor caminho: Dijkstra
a
b
c
d
e
f
g
2
4
3
5
1
3
1
1
2
4
3
a b c d e f g
a,0 a,2 a,3 ∞ a,4 ∞ ∞
Melhor caminho de a a g?
Saindo de do nó de menor caminho não marcado (b) posso alcançar d,
aumentando o custo de 5 para 7, e melhorar o caminho até e aumentando o
custo de 1 para 3
a,0 a,2 a,3 b,7 b,3 ∞ ∞
2
Melhor caminho: Dijkstra
a
b
c
d
e
f
g
2
4
3
5
1
3
1
1
2
4
3
a b c d e f g
a,0 a,2 a,3 ∞ a,4 ∞ ∞
Melhor caminho de a a g?
Saindo de do nó de menor caminho não marcado (c) posso alcançar f,
aumentando o custo de 1 para 4
a,0 a,2 a,3 b,7 b,3 ∞ ∞
a,0 a,2 a,3 b,7 b,3 c,4 ∞
2
Melhor caminho: Dijkstra
a
b
c
d
e
f
g
2
4
3
5
1
3
1
1
2
4
3
a b c d e f g
a,0 a,2 a,3 ∞ a,4 ∞ ∞
a,0 a,2 a,3 b,7 b,3 ∞ ∞
a,0 a,2 a,3 b,7 b,3 c,4 ∞
Melhor caminho de a a g?
Saindo de do nó de menor caminho não marcado (e) posso alcançar g
aumentando o custo de 4 para 7, e poderia alcançar f aumentando o custo de 1
para 4, porém não melhoraria o caminho de a a f existente então não vou fazer
a,0 a,2 a,3 b,7 b,3 c,4 e,7
2
Melhor caminho: Dijkstra
a
b
c
d
e
f
g
2
4
3
5
1
3
1
1
2
4
3
a b c d e f g
a,0 a,2 a,3 ∞ a,4 ∞ ∞
a,0 a,2 a,3 b,7 b,3 ∞ ∞
a,0 a,2 a,3 b,7 b,3 c,4 ∞
Melhor caminho de a a g?
Saindo de do nó de menor caminho não marcado (f) posso melhorar o caminho
até g aumentando o custo de 2 para 6, e poderia alcançar b aumentando o custo
de 3 para 7, porém não melhoraria o caminho de a a b existente então não vou
fazer
a,0 a,2 a,3 b,7 b,3 c,4 e,7
a,0 a,2 a,3 b,7 b,3 c,4 f,6
2
Melhor caminho: Dijkstra
a
b
c
d
e
f
g
2
4
3
5
1
3
1
1
2
4
3
a b c d e f g
a,0 a,2 a,3 ∞ a,4 ∞ ∞
a,0 a,2 a,3 b,7 b,3 ∞ ∞
a,0 a,2 a,3 b,7 b,3 c,4 ∞
Melhor caminho de a a g?
O nó de menor caminho não marcado é g. Então não posso melhorar o caminho
até g saindo de um outro no não marcado como d 🡺 acabou
a,0 a,2 a,3 b,7 b,3 c,4 e,7
a,0 a,2 a,3 b,7 b,3 c,4 f,6
2
Melhor caminho: Dijkstra
a
b
c
d
e
f
g
2
4
3
5
1
3
1
1
2
4
3
a b c d e f g
a,0 a,2 a,3 ∞ a,4 ∞ ∞
a,0 a,2 a,3 b,7 b,3 ∞ ∞
a,0 a,2 a,3 b,7 b,3 c,4 ∞
Melhor caminho de a a g?
O melhor caminho de a a g é 6 passando por f, f sendo alcançado com um custo
de 4 passando por c, c sendo alcançado com um custo de 3 passando por a que é
a origem do caminho
a,0 a,2 a,3 b,7 b,3 c,4 e,7
a,0 a,2 a,3 b,7 b,3 c,4 f,6
2
Exercício
• Aplicar o algoritmo de Dijkstra para obter o
melhor caminho de a a h
a
b
c
d
e
f
g
2
1
5
7
1
6
1
h
1
3
1
4
3
a
b
c
d
e
f
g
2
2
5
6
7
5
4
h
1
3
2
4
5
a b c d e f g h
a,0 ∞ ∞ ∞ ∞ ∞ ∞ ∞
a,2
a,2
∞ ∞ ∞ ∞ ∞
∞ ∞ ∞ ∞
a,2 c,9
e,7 e,7 c,9 ∞ ∞
d,11 d,10
c,9
d,10
d,11
d,10
e,7 a,2
Árvore de cobertura: Kruskal
• A árvore de cobertura pressupõe um grafo
ponderado conexo (todos os nós são alcançaveis dois
a dois)
• A árvore de cobertura é o sub-grafo conexo de custo
mínimo
a
b
c
d
e
f
g
2
4
3
5
1
3
1
1
2
4
3
a
b
c
d
e
f
g
2
1
1
1
2
2 2
Árvore de cobertura: Kruskal
• Construção da árvore de cobertura:
– As arestas do grafo original são armazenadas numa fila
ordenada por pesos crescentes
– Os n nó são colocados cada um em uma lista separada (as
listas de componentes conexas)
a
b
c
d
e
f
g
2
4
3
5
1
3
1
1
5
4
1
4
b
e
c
f
1 1
e
f
a
b
1 2
d
e
f
g
4 5
a
c
b
f
3 3
d
g
a
e
1 4
e
g d
4
b
5
a b c d
e f g
Árvore de cobertura: Kruskal
• Enquanto houver aresta na fila, retirar primeira
aresta da fila, se ela for unir duas componentes
conexas, inserir ela na árvore de cobertura
a
b
c
d
e
f
g
b
e
c
f
1 1
e
f
a
b
1 2
d
e
f
g
4 5
a
c
b
f
3 3
d
g
a
e
1 4
e
g d
4
b
5
a b c d
e f
g
1
Árvore de cobertura: Kruskal
• Enquanto houver aresta na fila, retirar primeira
aresta da fila, se ela for unir duas componentes
conexas, inserir ela na árvore de cobertura
a
b
c
d
e
f
g
c
f
1
e
f
a
b
1 2
d
e
f
g
4 5
a
c
b
f
3 3
b
e
a
e
1 4
e
g d
4
b
5
a
b c d
e f
g
1
1
Árvore de cobertura: Kruskal
• Enquanto houver aresta na fila, retirar primeira
aresta da fila, se ela for unir duas componentes
conexas, inserir ela na árvore de cobertura
a
b
c
d
e
f
g
e
f
a
b
1 2
d
e
f
g
4 5
a
c
b
f
3 3
c
f
a
e
1 4
e
g d
4
b
5
a
b c d
e f
g
1
1
1
Árvore de cobertura: Kruskal
• Enquanto houver aresta na fila, retirar primeira
aresta da fila, se ela for unir duas componentes
conexas, inserir ela na árvore de cobertura
a
b
c
d
e
f
g
a
b
2
d
e
f
g
4 5
a
c
b
f
3 3
e
f
a
e
1 4
e
g d
4
b
5
a
b c d
e f
g
1
1
1
1
Árvore de cobertura: Kruskal
• Enquanto houver aresta na fila, retirar primeira
aresta da fila, se ela for unir duas componentes
conexas, inserir ela na árvore de cobertura
a
b
c
d
e
f
g
d
e
f
g
4 5
a
c
b
f
3 3
a
b
a
e
2 4
e
g d
4
b
5
a
b c d
e f
g
1
1
1
1
2
Árvore de cobertura: Kruskal
• Enquanto houver aresta na fila, retirar primeira
aresta da fila, se ela for unir duas componentes
conexas, inserir ela na árvore de cobertura
a
b
c
d
e
f
g
d
e
f
g
4 5
b
f
3
a
c
a
e
3 4
e
g d
4
b
5
a
b c d
e f
g
1
1
1
1
2
Árvore de cobertura: Kruskal
• Enquanto houver aresta na fila, retirar primeira
aresta da fila, se ela for unir duas componentes
conexas, inserir ela na árvore de cobertura
a
b
c
d
e
f
g
d
e
f
g
4 5
b
f
a
e
3 4
e
g d
4
b
5
a
b c d
e f
g
1
1
1
1
2
Árvore de cobertura: Kruskal
• Enquanto houver aresta na fila, retirar primeira
aresta da fila, se ela for unir duas componentes
conexas, inserir ela na árvore de cobertura
a
b
c
d
e
f
g
f
g
5
d
e
a
e
4 4
e
g d
4
b
5
a
b
c d
e
f
g
1
1
1
1
2 4
Árvore de cobertura: Kruskal
• Enquanto houver aresta na fila, retirar primeira
aresta da fila, se ela for unir duas componentes
conexas, inserir ela na árvore de cobertura
a
b
c
d
e
f
g
f
g
5
a
e
4
e
g d
4
b
5
a
b
c d
e
f
g
1
1
1
1
2 4
Árvore de cobertura: Kruskal
• Enquanto houver aresta na fila, retirar primeira
aresta da fila, se ela for unir duas componentes
conexas, inserir ela na árvore de cobertura
a
b
c
d
e
f
g
f
g
5
e
g
4
d
b
5
a
b
c d
e
f
g
1
1
1
1
2 4
Árvore de cobertura: Kruskal
• Enquanto houver aresta na fila, retirar primeira
aresta da fila, se ela for unir duas componentes
conexas, inserir ela na árvore de cobertura
a
b
c
d
e
f
g
f
g
5
b
d
5
a
b
c d
e
f
g
1
1
1
1
2 4
Árvore de cobertura: Kruskal
• Enquanto houver aresta na fila, retirar primeira
aresta da fila, se ela for unir duas componentes
conexas, inserir ela na árvore de cobertura
a
b
c
d
e
f
g
f
g
5
a
b
c d
e
f
g
1
1
1
1
2 4
Exercício
• Aplicar o algoritmo de Kruskal para obter a árvore
de cobertura do grafo seguinte
a
b
c
d
e
f
g
2
1
5
4
1
5
1
h
1
2
1
4
3
a
b
c
d
e
f
g
2
2
5
6
3
5
4
h
1
3
2
4
5
a
b
c
d
e
f
g
h
(g,h,1) (a, e, 2) (a,c,2) (e,c,2)(c,f,3)(d,h,3)(b,d,4)(d,g,4)(e,d,5)(e,b,5)(f,g,5)(b,f,6)
a
b
c
d
e f g h
1
2
2
3
3
4
5

9-Grafos_Estrutura de dados computacao aprese.pptx

  • 1.
  • 2.
  • 3.
  • 4.
    Terminologia a b d e c f Vértice / Nó Aresta Grau/ Valência: número de aresta que incidem de um nó Adjacente/vizinho: No alcançado a partir de um nó via uma aresta Passeio: sequência alternada de nós e arestas Caminho: sequência de vértice tal que cada nó sucessivo do caminho é separado por uma aresta Caminho simples: caminho que não contém nenhum nó repetido Comprimento do caminho: número de arestas do caminho (numero de vértices - 1)
  • 5.
    Terminologia a b d e c f Vértice / Nó Aresta Caminhoeuleriano: caminho que passa por todas as arestas apenas uma vez Caminho hamiltoniano: caminho que passa por todos os nós apenas uma vez Ciclo: caminho que inicia e termina com o mesmo nó Ciclo euleriano: caminho euleriano que inicia e termina com o mesmo nó Ciclo hamiltoniano: caminho hamiltoniano que inicia e termina com o mesmo nó
  • 6.
    Grafos orientados/direcionados a b d e c f As arestasjuntam dois nós e um sentido único
  • 7.
    Grafos ponderados /com peso a b d e c f 2 3 5 6 4 3 2 O comprimento de cada aresta é ponderado por um peso No caso do não ponderado o comprimento de cada aresta é 1
  • 8.
    4 famílias degrafos Não ponderado Ponderado Não orientado Orientado 3 3
  • 9.
    Terminologia • Grafo completo:para cada nó existe uma aresta relacionando o nó com todos os outros nós • Grafo conexo: sempre existe um caminho entre dois nós • Ponto de articulação: nó cuja remoção divide o grafo conexos em dois sub-grafos isolados • As árvores são grafos acíclicos
  • 11.
    Representação na mémoria •Lista de adjacência: – Um nó memoriza a lista de todas as arestas incidentes – Uma aresta tem um peso e uma referência do nó vizinho • Matriz de adjacência/incidência: – Ambas colunas e linhas da matriz representam a lista dos nós do grafo – matriz [i][j] memoriza o peso da aresta do nó i para o nó j, -1 (ou outro valor simbólico caso o peso possa ser negativo) caso está aresta não exista
  • 12.
    Lista de adjacência classNo { String identificador; ArrayList <Aresta> adjacentes; } class Aresta { int peso No vizinho; } class Grafo { ArrayList <No> nos; } grafo A C F K 2 C 3 K 2 A 5 K 2 A 2 A 4 F
  • 13.
    Lista de adjacência classNo { String identificador; ArrayList <Aresta> arestas; } class Aresta { int peso No vizinho; } class Grafo { ArrayList <No> nos; } grafo A C F K 2 C 3 K 2 A 5 K 2 A 2 A 4 F A C F K 2 2 3 5 2 2 4
  • 14.
    Matriz de adjacência classNo { String identificador; } class Grafo { ArrayList <No> nos; int [][] pesos; } 0 2 -1 3 2 0 -1 5 2 -1 0 -1 2 -1 4 0 A C F K A C F K A C F K 2 2 3 5 2 2 4 grafo A C F K
  • 15.
    Representação na mémoria •Qual representação escolher? – As estruturas de dados usadas na matriz de adjacência são mais leves, porém o peso (-1) precisa ser memorizado para as arestas que não existem ⇒ A matriz de adjacência é melhor para os grafos completos ou perto de ser completos ⇒ A lista de adjacência é melhor nas outras situações
  • 16.
    Percursos em Grafos •Os tipos de percurso em grafos (percurso em largura ou profundidade) são parecidos com os percursos em árvore, porem: – O grafo não contém raiz ⇒ o percurso pode iniciar a partir de qualquer nó – O grafo pode conter ciclos ⇒ precisamos garantir que cada nó será alcançado apenas uma vez durante o percurso ou o algoritmo pode entrar em loop infinito
  • 17.
    Percurso em profundidade a b c d e f g a b c d e f g bc d e f e g g b class No { String identificador; ArrayList <Aresta> arestas; boolean explorado; } class Aresta { int peso No vizinho; } class Grafo { ArrayList <No> nos; } e f
  • 18.
    Percurso em profundidade a b c d e f g a b c d e f g bc d e f e g g b e f Explorar: tratar o nó (imprimir por exemplo), marcar o nó, e explorar os vizininhos não marcados Saída: a
  • 19.
    Percurso em profundidade a b c d e f g a b c d e f g bc d e f e g g b e f Explorar: tratar o nó (imprimir por exemplo), marcar o nó, e explorar os vizininhos não marcados Saída: a - b
  • 20.
    Percurso em profundidade a b c d e f g a b c d e f g bc d e f e g g b e f Explorar: tratar o nó (imprimir por exemplo), marcar o nó, e explorar os vizininhos não marcados Saída: a Saída: a – b - d
  • 21.
    Percurso em profundidade a b c d e f g a b c d e f g bc d e f e g g b e f Explorar: tratar o nó (imprimir por exemplo), marcar o nó, e explorar os vizininhos não marcados Saída: a – b – d - e
  • 22.
    Percurso em profundidade a b c d e f g a b c d e f g bc d e f e g g b e f Explorar: tratar o nó (imprimir por exemplo), marcar o nó, e explorar os vizininhos não marcados Saída: a – b – d – e - g
  • 23.
    Percurso em profundidade a b c d e f g a b c d e f g bc d e f e g g b e f Explorar: tratar o nó (imprimir por exemplo), marcar o nó, e explorar os vizininhos não marcados Saída: a – b – d – e - g
  • 24.
    Percurso em profundidade a b c d e f g a b c d e f g bc d e f e g g b e f Explorar: tratar o nó (imprimir por exemplo), marcar o nó, e explorar os vizininhos não marcados Saída: a – b – d – e – g - f
  • 25.
    Percurso em profundidade a b c d e f g a b c d e f g bc d e f e g g b e f Explorar: tratar o nó (imprimir por exemplo), marcar o nó, e explorar os vizininhos não marcados Saída: a – b – d – e – g - f
  • 26.
    Percurso em profundidade a b c d e f g a b c d e f g bc d e f e g g b e f Explorar: tratar o nó (imprimir por exemplo), marcar o nó, e explorar os vizininhos não marcados Saída: a – b – d – e – g - f
  • 27.
    Percurso em profundidade a b c d e f g a b c d e f g bc d e f e g g b e f Explorar: tratar o nó (imprimir por exemplo), marcar o nó, e explorar os vizininhos não marcados Saída: a – b – d – e – g - f
  • 28.
    Percurso em profundidade a b c d e f g a b c d e f g bc d e f e g g b e f Explorar: tratar o nó (imprimir por exemplo), marcar o nó, e explorar os vizininhos não marcados Saída: a – b – d – e – g - f
  • 29.
    Percurso em profundidade a b c d e f g a b c d e f g bc d e f e g g b e f Explorar: tratar o nó (imprimir por exemplo), marcar o nó, e explorar os vizininhos não marcados Saída: a – b – d – e – g – f - c
  • 30.
    Percurso em profundidade a b c d e f g a b c d e f g bc d e f e g g b e f Explorar: tratar o nó (imprimir por exemplo), marcar o nó, e explorar os vizinhos não marcados Saída: a – b – d – e – g – f - c
  • 31.
    Percurso em profundidade a b c d e f g a b c d e f g bc d e f e g g b e f Saída: a – b – d – e – g – f - c
  • 32.
  • 33.
    Percurso em largura a b c d e f g a b c d e f g bc d e f e g g b f Introduzir o primeiro na fila Enquanto houver nó na fila Remover o primeiro nó da fila, Se o nó não for marcado, marcar ele, imprimir ele inserir os adjacentes não marcados na fila a Fila
  • 34.
    Percurso em largura a b c d e f g a b c d e f g bc d e f e g g b f Introduzir o primeiro na fila Enquanto houver nó na fila Remover o primeiro nó da fila, Se o nó não for marcado, marcar ele, imprimir ele inserir os adjacentes não marcados na fila b Fila c a Saída: a
  • 35.
    Percurso em largura a b c d e f g a b c d e f g bc d e f e g g b f Introduzir o primeiro na fila Enquanto houver nó na fila Remover o primeiro nó da fila, Se o nó não for marcado, marcar ele, imprimir ele inserir os adjacentes não marcados na fila c Fila d b e Saída: a – b
  • 36.
    Percurso em largura a b c d e f g a b c d e f g bc d e f e g g b f Introduzir o primeiro na fila Enquanto houver nó na fila Remover o primeiro nó da fila, Se o nó não for marcado, marcar ele, imprimir ele inserir os adjacentes não marcados na fila d Fila e c f Saída: a – b – c
  • 37.
    Percurso em largura a b c d e f g a b c d e f g bc d e f e g g b f Introduzir o primeiro na fila Enquanto houver nó na fila Remover o primeiro nó da fila, Se o nó não for marcado, marcar ele, imprimir ele inserir os adjacentes não marcados na fila e Fila f d e g Saída: a – b – c – d
  • 38.
    Percurso em largura a b c d e f g a b c d e f g bc d e f e g g b f Introduzir o primeiro na fila Enquanto houver nó na fila Remover o primeiro nó da fila, Se o nó não for marcado, marcar ele, imprimir ele inserir os adjacentes não marcados na fila f Fila e e g g f Saída: a – b – c – d – e
  • 39.
    Percurso em largura a b c d e f g a b c d e f g bc d e f e g g b f Introduzir o primeiro na fila Enquanto houver nó na fila Remover o primeiro nó da fila, Se o nó não for marcado, marcar ele, imprimir ele inserir os adjacentes não marcados na fila Fila e f g g f g Saída: a – b – c – d – e – f
  • 40.
    Percurso em largura a b c d e f g a b c d e f g bc d e f e g g b f Introduzir o primeiro na fila Enquanto houver nó na fila Remover o primeiro nó da fila, Se o nó não for marcado, marcar ele, imprimir ele inserir os adjacentes não marcados na fila Fila e g g f g Saída: a – b – c – d – e – f
  • 41.
    Percurso em largura a b c d e f g a b c d e f g bc d e f e g g b f Introduzir o primeiro na fila Enquanto houver nó na fila Remover o primeiro nó da fila, Se o nó não for marcado, marcar ele, imprimir ele inserir os adjacentes não marcados na fila Fila g g f g Saída: a – b – c – d – e – f – g
  • 42.
    Percurso em largura a b c d e f g a b c d e f g bc d e f e g g b f Introduzir o primeiro na fila Enquanto houver nó na fila Remover o primeiro nó da fila, Se o nó não for marcado, marcar ele, imprimir ele inserir os adjacentes não marcados na fila Fila g f g Saída: a – b – c – d – e – f – g
  • 43.
    Percurso em largura a b c d e f g a b c d e f g bc d e f e g g b f Introduzir o primeiro na fila Enquanto houver nó na fila Remover o primeiro nó da fila, Se o nó não for marcado, marcar ele, imprimir ele inserir os adjacentes não marcados na fila Fila f g Saída: a – b – c – d – e – f – g
  • 44.
    Percurso em largura a b c d e f g a b c d e f g bc d e f e g g b f Introduzir o primeiro na fila Enquanto houver nó na fila Remover o primeiro nó da fila, Se o nó não for marcado, marcar ele, imprimir ele inserir os adjacentes não marcados na fila Fila g Saída: a – b – c – d – e – f – g
  • 45.
  • 46.
    Melhor caminho: Dijkstra a b c d e f g 2 4 3 5 1 3 1 1 2 4 3 ab c d e f g a,0 ∞ ∞ ∞ ∞ ∞ ∞ Melhor caminho de a a g? Todas as distâncias de a até os outros elementos São inicializadas a ∞ (tirando a distancia de a para a) 2
  • 47.
    Melhor caminho: Dijkstra a b c d e f g 2 4 3 5 1 3 1 1 2 4 3 ab c d e f g a,0 a,2 a,3 ∞ a,4 ∞ ∞ Melhor caminho de a a g? Saindo de do nó de menor caminho não marcado (a) posso alcançar b, aumentando o custo de 2, c aumentando o custo de 3 e e aumentando o custo de 4 2
  • 48.
    Melhor caminho: Dijkstra a b c d e f g 2 4 3 5 1 3 1 1 2 4 3 ab c d e f g a,0 a,2 a,3 ∞ a,4 ∞ ∞ Melhor caminho de a a g? Saindo de do nó de menor caminho não marcado (b) posso alcançar d, aumentando o custo de 5 para 7, e melhorar o caminho até e aumentando o custo de 1 para 3 a,0 a,2 a,3 b,7 b,3 ∞ ∞ 2
  • 49.
    Melhor caminho: Dijkstra a b c d e f g 2 4 3 5 1 3 1 1 2 4 3 ab c d e f g a,0 a,2 a,3 ∞ a,4 ∞ ∞ Melhor caminho de a a g? Saindo de do nó de menor caminho não marcado (c) posso alcançar f, aumentando o custo de 1 para 4 a,0 a,2 a,3 b,7 b,3 ∞ ∞ a,0 a,2 a,3 b,7 b,3 c,4 ∞ 2
  • 50.
    Melhor caminho: Dijkstra a b c d e f g 2 4 3 5 1 3 1 1 2 4 3 ab c d e f g a,0 a,2 a,3 ∞ a,4 ∞ ∞ a,0 a,2 a,3 b,7 b,3 ∞ ∞ a,0 a,2 a,3 b,7 b,3 c,4 ∞ Melhor caminho de a a g? Saindo de do nó de menor caminho não marcado (e) posso alcançar g aumentando o custo de 4 para 7, e poderia alcançar f aumentando o custo de 1 para 4, porém não melhoraria o caminho de a a f existente então não vou fazer a,0 a,2 a,3 b,7 b,3 c,4 e,7 2
  • 51.
    Melhor caminho: Dijkstra a b c d e f g 2 4 3 5 1 3 1 1 2 4 3 ab c d e f g a,0 a,2 a,3 ∞ a,4 ∞ ∞ a,0 a,2 a,3 b,7 b,3 ∞ ∞ a,0 a,2 a,3 b,7 b,3 c,4 ∞ Melhor caminho de a a g? Saindo de do nó de menor caminho não marcado (f) posso melhorar o caminho até g aumentando o custo de 2 para 6, e poderia alcançar b aumentando o custo de 3 para 7, porém não melhoraria o caminho de a a b existente então não vou fazer a,0 a,2 a,3 b,7 b,3 c,4 e,7 a,0 a,2 a,3 b,7 b,3 c,4 f,6 2
  • 52.
    Melhor caminho: Dijkstra a b c d e f g 2 4 3 5 1 3 1 1 2 4 3 ab c d e f g a,0 a,2 a,3 ∞ a,4 ∞ ∞ a,0 a,2 a,3 b,7 b,3 ∞ ∞ a,0 a,2 a,3 b,7 b,3 c,4 ∞ Melhor caminho de a a g? O nó de menor caminho não marcado é g. Então não posso melhorar o caminho até g saindo de um outro no não marcado como d 🡺 acabou a,0 a,2 a,3 b,7 b,3 c,4 e,7 a,0 a,2 a,3 b,7 b,3 c,4 f,6 2
  • 53.
    Melhor caminho: Dijkstra a b c d e f g 2 4 3 5 1 3 1 1 2 4 3 ab c d e f g a,0 a,2 a,3 ∞ a,4 ∞ ∞ a,0 a,2 a,3 b,7 b,3 ∞ ∞ a,0 a,2 a,3 b,7 b,3 c,4 ∞ Melhor caminho de a a g? O melhor caminho de a a g é 6 passando por f, f sendo alcançado com um custo de 4 passando por c, c sendo alcançado com um custo de 3 passando por a que é a origem do caminho a,0 a,2 a,3 b,7 b,3 c,4 e,7 a,0 a,2 a,3 b,7 b,3 c,4 f,6 2
  • 54.
    Exercício • Aplicar oalgoritmo de Dijkstra para obter o melhor caminho de a a h a b c d e f g 2 1 5 7 1 6 1 h 1 3 1 4 3
  • 55.
    a b c d e f g 2 2 5 6 7 5 4 h 1 3 2 4 5 a b cd e f g h a,0 ∞ ∞ ∞ ∞ ∞ ∞ ∞ a,2 a,2 ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ a,2 c,9 e,7 e,7 c,9 ∞ ∞ d,11 d,10 c,9 d,10 d,11 d,10 e,7 a,2
  • 56.
    Árvore de cobertura:Kruskal • A árvore de cobertura pressupõe um grafo ponderado conexo (todos os nós são alcançaveis dois a dois) • A árvore de cobertura é o sub-grafo conexo de custo mínimo a b c d e f g 2 4 3 5 1 3 1 1 2 4 3 a b c d e f g 2 1 1 1 2 2 2
  • 57.
    Árvore de cobertura:Kruskal • Construção da árvore de cobertura: – As arestas do grafo original são armazenadas numa fila ordenada por pesos crescentes – Os n nó são colocados cada um em uma lista separada (as listas de componentes conexas) a b c d e f g 2 4 3 5 1 3 1 1 5 4 1 4 b e c f 1 1 e f a b 1 2 d e f g 4 5 a c b f 3 3 d g a e 1 4 e g d 4 b 5 a b c d e f g
  • 58.
    Árvore de cobertura:Kruskal • Enquanto houver aresta na fila, retirar primeira aresta da fila, se ela for unir duas componentes conexas, inserir ela na árvore de cobertura a b c d e f g b e c f 1 1 e f a b 1 2 d e f g 4 5 a c b f 3 3 d g a e 1 4 e g d 4 b 5 a b c d e f g 1
  • 59.
    Árvore de cobertura:Kruskal • Enquanto houver aresta na fila, retirar primeira aresta da fila, se ela for unir duas componentes conexas, inserir ela na árvore de cobertura a b c d e f g c f 1 e f a b 1 2 d e f g 4 5 a c b f 3 3 b e a e 1 4 e g d 4 b 5 a b c d e f g 1 1
  • 60.
    Árvore de cobertura:Kruskal • Enquanto houver aresta na fila, retirar primeira aresta da fila, se ela for unir duas componentes conexas, inserir ela na árvore de cobertura a b c d e f g e f a b 1 2 d e f g 4 5 a c b f 3 3 c f a e 1 4 e g d 4 b 5 a b c d e f g 1 1 1
  • 61.
    Árvore de cobertura:Kruskal • Enquanto houver aresta na fila, retirar primeira aresta da fila, se ela for unir duas componentes conexas, inserir ela na árvore de cobertura a b c d e f g a b 2 d e f g 4 5 a c b f 3 3 e f a e 1 4 e g d 4 b 5 a b c d e f g 1 1 1 1
  • 62.
    Árvore de cobertura:Kruskal • Enquanto houver aresta na fila, retirar primeira aresta da fila, se ela for unir duas componentes conexas, inserir ela na árvore de cobertura a b c d e f g d e f g 4 5 a c b f 3 3 a b a e 2 4 e g d 4 b 5 a b c d e f g 1 1 1 1 2
  • 63.
    Árvore de cobertura:Kruskal • Enquanto houver aresta na fila, retirar primeira aresta da fila, se ela for unir duas componentes conexas, inserir ela na árvore de cobertura a b c d e f g d e f g 4 5 b f 3 a c a e 3 4 e g d 4 b 5 a b c d e f g 1 1 1 1 2
  • 64.
    Árvore de cobertura:Kruskal • Enquanto houver aresta na fila, retirar primeira aresta da fila, se ela for unir duas componentes conexas, inserir ela na árvore de cobertura a b c d e f g d e f g 4 5 b f a e 3 4 e g d 4 b 5 a b c d e f g 1 1 1 1 2
  • 65.
    Árvore de cobertura:Kruskal • Enquanto houver aresta na fila, retirar primeira aresta da fila, se ela for unir duas componentes conexas, inserir ela na árvore de cobertura a b c d e f g f g 5 d e a e 4 4 e g d 4 b 5 a b c d e f g 1 1 1 1 2 4
  • 66.
    Árvore de cobertura:Kruskal • Enquanto houver aresta na fila, retirar primeira aresta da fila, se ela for unir duas componentes conexas, inserir ela na árvore de cobertura a b c d e f g f g 5 a e 4 e g d 4 b 5 a b c d e f g 1 1 1 1 2 4
  • 67.
    Árvore de cobertura:Kruskal • Enquanto houver aresta na fila, retirar primeira aresta da fila, se ela for unir duas componentes conexas, inserir ela na árvore de cobertura a b c d e f g f g 5 e g 4 d b 5 a b c d e f g 1 1 1 1 2 4
  • 68.
    Árvore de cobertura:Kruskal • Enquanto houver aresta na fila, retirar primeira aresta da fila, se ela for unir duas componentes conexas, inserir ela na árvore de cobertura a b c d e f g f g 5 b d 5 a b c d e f g 1 1 1 1 2 4
  • 69.
    Árvore de cobertura:Kruskal • Enquanto houver aresta na fila, retirar primeira aresta da fila, se ela for unir duas componentes conexas, inserir ela na árvore de cobertura a b c d e f g f g 5 a b c d e f g 1 1 1 1 2 4
  • 70.
    Exercício • Aplicar oalgoritmo de Kruskal para obter a árvore de cobertura do grafo seguinte a b c d e f g 2 1 5 4 1 5 1 h 1 2 1 4 3
  • 71.
  • 72.
    a b c d e f g h (g,h,1) (a, e,2) (a,c,2) (e,c,2)(c,f,3)(d,h,3)(b,d,4)(d,g,4)(e,d,5)(e,b,5)(f,g,5)(b,f,6) a b c d e f g h 1 2 2 3 3 4 5