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ó
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
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
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
Á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