Você está na página 1de 3

ALGORITMO PRIM

EXPLICAÇÃO

O Prim recebe um gráfico direcionado, conectado e com peso, mas retorna a


Árvore Geradora Mínima deste gráfico.

Ele funciona de maneira gulosa. Primeiro, ele seleciona um vértice arbitrário.


Depois, ele adiciona o vértice mais próximo à árvore construída até agora a cada
passo, até que não existam vértices desconectados sobrando.

EXEMPLO - PASSO 1

Supondo que o vértice arbitrário para iniciar o algoritmo


seja B, temos três opções para prosseguir: A, C e E. Os
pesos correspondentes das arestas são 2, 2 e 5, portanto o
mínimo é 2. Neste caso, temos duas arestas pesando 2,
logo, podemos escolher qualquer uma delas (não importa
qual). Neste exemplo, vamos escolher A.

EXEMPLO - PASSO 2

Agora, vamos adicionar o vértice


mais próximo à árvore construída
até agora a cada passo, até que não
existam vértices desconectados
sobrando.
Prim(G) # G é grafo # Escolhe qualquer vértice do
grafo como vértice inicial/de partida s ←seleciona-
um-elemento(vertices(G)) para todo v ∈vertices(G) #
π[v] indica o predecessor de v π[v] ← nulo # Q é um
PSEUDOCÓDIGO
conjunto de pares (peso, vértice) Q ← {(0, s) # S é um
conjunto que armazena os vértices # cujas adjacências
já foram analisadas S ← ø enquanto Q ≠ ø # adiciona
o vértice inicial na lista v ← extrair-mín(Q) S S← ∪
{v}
# adiciona os vértices adjacentes em Q para cada u
adjacente a v se u ∉ S e pesoDaAresta(π[u] u) > →

pesoDaAresta(v u) # as próximas duas linhas
selecionam o menor vértice # adjacente ao vértice u Q
← →
Q \ {(pesoDaAresta(π[u] u), u)} Q ←Q ∪

{(pesoDaAresta(v u), u)} Q <- Q u {pesoDaArest(v-
>)%2, Q++} π[u] ← v print(Pronto) retorna {(π[v], v) | v
∈ ≠
vertices(G) e π[v] nulo}

CUSTO

Complexidade varia com a implementação, porém a


implementação com lista de adjacência, como é o caso, tem custo
de O(|A|*log|V|), onde A é o número de arestas e V o número e
vértices(editado).
ALGORITMO
DIJKSTRA

EXPLICAÇÃO

Esse algoritmo pode ser dividido em dois passos: Inicialização


e Avaliação. Na Inicialização, o algoritmo define a distância
do noInicial como zero, a distância dos outros nós como
infinito e adiciona o noInicial ao grupo de nós Não
Resolvidos. Na Avaliação, o algoritmo escolhe um nó de
avaliação dentre os do grupo Não Resolvido, calcula a
distância de seus vizinhos e adiciona vizinhos não
Resolvidos ao grupo Não Resolvidos.

EXEMPLO - INICIALIZAÇÃO

Definimos a distância de A
como zero e a de todos os
outros nós como infinito.
Depois disso, colocamos A no
grupo de nós Não Resolvidos.

EXEMPLO - AVALIAÇÃO

Agora, escolhemos o nó com a menor distância do conjunto Não Resolvido e


avaliamos todos os nós adjacentes que não estão em nós Resolvidos. A ideia é
adicionar o peso da aresta à distância do nó de avaliação e, em seguida,
compará-lo com a distância do destino. Para o nó B, 0 + 10 é menor que
INFINITO, então a nova distância para o nó B é 10, e o novo predecessor é A, o
mesmo se aplica ao nó C. O nó A é então movido dos nós Não Resolvidos para
os nós Resolvidos . Os nós B e C são adicionados aos nós Não Resolvidos
porque eles podem ser alcançados, mas precisam ser avaliados. Agora que
temos dois nós no conjunto Não Resolvido, escolhemos aquele com a menor
distância e, em seguida, reiteramos até estabelecermos todos os nós no gráfico.

dijkstra(G) # G é um grafo # inicialização s ←


seleciona-um-elemento(vertices(G)) para todo
v ∈ vertices(G) d[v] ←∞
# π[v] representa o PSEUDOCÓDIGO
vértice de onde parte a aresta que # chega em
v diretamente π[v] ←
-1 # s é o vértice inicial,
com distância 0 d[s] 0 Q ← ←
vertices(G) #
algoritmo em si enquanto Q ≠
ø # extrái o
vértice com a menor distância # como todos,
menos s, tem distância infinita # ele começa
com s u ←
extrair-mín(Q) para cada v
adjacente a u se d[v] > d[u] + peso(u, v) então

d[v] d[u] + peso(u, v) π[v] u. ←

CUSTO

O custo do algoritmo de
dijkstra é, no pior caso, O(E
+ V*log|V|)
PRIM
VERSUS

DIJKSTRA
COMPARANDO OS DOIS ALGORITMOS

Na prática, Prim é usado Na prática, Dijkstra é usado


quando queremos minimizar quando nós queremos
custos quando tentando economizar recursos
conectar vários pontos entre
si. viajando de um ponto a
outro.

Prim acha a árvore Dijkstra acha o


geradora mínima. caminho mais curto.

Prim só funciona em Dijkstra funciona em


gráficos não gráficos direcionados
direcionados e não direcionados.

Dijkstra pode não


conseguir computar
Prim consegue lidar
distâncias
com arestas com
precisamente se pelo
peso negativo.
menos uma aresta
negativa existir.

Você também pode gostar