Para descrever o algoritmo, precisamos de um pouco de terminologia e
notação. Suponha que T é uma árvore radicada, com raiz s, em um
grafo G com custos positivos nos arcos. A fronteira de T é o conjunto de todos os vizinhos de T. Assim, um vértice v pertence à fronteira de T se v não está em T mas é vizinho de algum vértice de T. Denotaremos por
T +
o subgrafo de G que consiste em T, mais os vértices da fronteira de T,
mais os arcos de G que têm ponta inicial em T e ponta final fora de T (e portanto na fronteira de T).
Para cada vértice v de G, denotaremos por dist[v]
a distância de s a v em T . É fácil entender dist[v]: +
se v está em T então dist[v] é o custo do único caminho
de s a v em T; se v está na fronteira de T então dist[v] é a menor das somas da forma dist[u] + cst, sendo u um vértice em T que tem v como vizinho e cst o custo do arco u-v; se v não está em T nem na fronteira de T então dist[v] é infinito.
Um gancho de um vértice v da fronteira de T é o penúltimo vértice de
algum caminho mínimo de s a v em T . É claro que todo gancho de v está +
em T edist[v] ≡ dist[u] + cst, sendo u um gancho de v e cst o custo do
arco u-v.
Podemos agora descrever o algoritmo de Dijkstra para o problema da
SPT. O algoritmo é iterativo. Cada iteração começa com uma árvore radicada T, com raiz s, e o vetor dist[] de distâncias em T . No começo da +
primeira iteração, s é o único vértice de T e dist[] é definido da maneira
óbvia. O processo iterativo pode ser descrito assim: enquanto a fronteira de T não estiver vazia,
1. escolha um vértice y na fronteira de T que tenha dist[]
mínimo; 2. seja x um gancho de y; 3. acrescente o arco x-y e o vértice y a T; 4. atualize dist[].
A escolha de y no início da iteração deve ser entendida assim: y é um
vértice fora de T tal que dist[y] ≤ dist[v] para cada v na fronteira de T. Podemos dizer, informalmente, que y é o vértice mais próximo de s fora de T.