Aula 3
Algoritmo de Dijkstra
Caminhamento em Grafos
ATP4
1
Algoritmo de Dijkstra (1975)
• Considere um grafo G = (V,E), cujas arestas possuem
pesos não-negativos
• O Algoritmo de Dijkstra resolve o problema dos caminhos
mais curtos de única origem
• Estruturas de dados:
– E(x,y): existe aresta de x para y?
– w(x,y): peso da aresta de x para y
– incluídos: conjunto dos vértices cujos menores caminhos a
partir do inicial já são conhecidos
– borda: conjunto dos vértices candidatos à próxima escolha
– antecessor[x]: vértice antecessor de x no menor caminho
– custo[x]: custo do caminho até x
ATP4
2
Algoritmo de Dijkstra...
DIJKSTRA(Grafo G, int v0)
borda = {v0}; incluídos = {}; antecessor[x] = -1, x
custo[x] = , x; custo[v0] = 0;
Enquanto borda não vazia faça
v = vértice da borda com o menor custo
insira v em incluídos; retire v da borda
para todo x = 1,...,G.n, tq (x  incluídos)
se E(v,x) e (custo[x] > custo[v] + w(v,x))
custo[x] = custo[v] + w(v,x);
insira x na borda
antecessor[x] = v
ATP4
3
Algoritmo de Dijkstra...
Ant
-
-
-
A
6
B
-
0
5
C




B
C
2
6
D
C
A
5
5
3
-
6
E
D
E
3
ATP4
4
Algoritmo de Dijkstra...
Ant
-
A
-
A
6
B
A
0
6
C
B

6

5
A
C
5
2
6
D
C
5
5
5
3
-
6
E
D
E
3
ATP4
5
Algoritmo de Dijkstra...
Ant
-
A
E
A
6
B
C
5
0
6
C
6
7
11
6
E
5
A
B
C
5
2
6
D
A
5
5
3
E
2
D
6
E
3
ATP4
6
Algoritmo de Dijkstra...
Ant
-
A
E
A
6
B
0
6
C
2
6
C
5
6
D
A
5
5
3
B
E
B
6
7
9
5
A
C
5
3
2
D
E
3
ATP4
7
Algoritmo de Dijkstra...
Ant
-
A
E
A
6
B
0
6
C
2
6
C
5
6
D
A
5
5
3
B
E
B
6
7
9
5
A
C
5
3
2
D
E
3
ATP4
8
Algoritmo de Dijkstra...
Ant
-
A
E
A
6
B
0
6
C
2
6
C
5
6
D
A
5
5
3
B
E
B
6
7
9
5
A
C
5
3
2
D
E
3
ATP4
9
Algoritmo de Dijkstra
• Análise da eficiência:
– Para grafos densos utilizando matrizes de
adjacências, tempo de execução é O(n2).
– Para grafos esparsos, utilizando listas de
adjacências, tempo de execução é O(e
log(n)).
ATP4
10
Busca em Profundidade
• A busca em profundidade é uma forma de visitar
todos os vértices de modo sistemático
• Pequenas modificações no algoritmo podem nos dar
informações bastante interessantes sobre o grafo
• Estruturas de dados:
– boolean marcado[1..n]
marcado[v] = false, para todo v
– int antecessor[1..n]
antecessor[v] = 0, para todo v
ATP4
11
Busca em Profundidade...
void BuscaProfundidade(int v) {
marcado[v] = true;
para w = 1,2,...,n faça {
se E(v,w) e ! marcado[w] {
antecessor[w] = v;
BuscaProfundidade(w);
}
}
}
ATP4
12
Busca em Profundidade...
void BuscaProfundidade(int v) {
marcado[v] = true;
P.empilha(v);
enquanto ! P.vazia() faça {
w = P.desempilha();
para z = 1,2,...,n faça {
se E(z,w) e ! marcado[z] {
antecessor[z] = w;
marcado[z] = true;
P.empilha(z);
}
}
}
}
ATP4
13
Busca em Amplitude...
void BuscaAmplitude(int v) {
marcado[v] = true;
F.insere(v);
enquanto ! F.vazia() faça {
w = P.retira();
para z = 1,2,...,n faça {
se E(z,w) e ! marcado[z]{
antecessor[z] = w;
marcado[z] = true;
P.insere(z);
}
}
}
}
ATP4
14
Download

Aula 3