Algoritmo de Dijkstra

 

O algoritmo de Dijkstra,  inicialmente, o usuário deve entrar com a matriz de custo do grafo. No entanto, este algoritmo considera que o grafo tem um vértice inicial. Assim, ele só calcula o caminho mínimo do vértice inicial para todos os outros. Portanto, o usuário deve definir em seguida qual é o vértice inicial. (final)

O algoritmo gera então dois vetores simples: 1)uma matriz de rota e 2)uma matriz de custo mínimo.

 

Leia (Custo[ ]);                                            //ler matriz de custo

Leia (vert);                                                  //ler vértice inicial

Para i = 1 .. n faça                                       // n é o número de vértices

    Begin

    Rota[i] = vert;                                         // Rota do vértice inicial até o vértice i

    Dist[i] = Custo[vert,i]                             // Custo inicial do vértice inicial até o vértice i

    End

Para a = 1.. n faça

    Para todo k Î G+(a)                                 //Para todo vértice k que é sucessor do vértice a

    Begin

    P = mín(D[k], D[a]+Custo[a,k]);

    If (P < D[k]) Then

          Begin

          Rota[k] = a;

          Dist[k] = P;

          End

 

Só lembrando que os vértices sucessores de a serão aqueles que têm um valor de custo diferente de 0 (ou seja, não é o próprio vértice) e diferente de ¥ (ou seja, não existe aresta entre eles e, portanto, o vértice não é um sucessor).

         Considere por exemplo o seguinte grafo:

                         

                1                  2                                  2                                        

                                                                                    3

              10                                                                

                                       7                                                                3

                                                           8

 

              5                                                            4

                                                                 

                                             5

           

                                                      4

Inicialmente, o algoritmo solicita que o usuário entre a matriz de custo do grafo.

 

1

2

3

4

5

1

0

2

¥

¥

10

2

¥

0

3

¥

7

3

¥

¥

0

4

¥

4

¥

¥

¥

0

¥

5

¥

¥

8

5

0

Em seguida, pergunta qual é o vértice inicial. Vamos considerar que o vértice inicial é o vértice 1. Temos então:

 

Vert = 1

Rota[1,1,1,1,1].

Dist[0,2, ¥,¥,10]

 

Ou seja, inicialmente ele inicializa todas as posições do vetor Rota com o vértice inicial. Em seguida, coloca o custo das arestas do vértice inicial para todas as outras. Quando a aresta não existe, o valor ¥ é colocado.

 

a = 1, k=1    vértice 1 não é sucessor de 1

          k=2    D[2] x D[1] + Custo[1,2] à 2 x 0+2 à p=2.    p < D[k]?? 2 <2 ? Não!

          k=3    vértice 3 não é sucessor de 1

          k=4    4 não é sucessor de 1       

          k=5    D[5] x D[1] + Custo[1,5] à 10 x 0+10 à p=10 p < D[k]? 10 < 10? Não!

 

a = 2, k=1    vértice 1 não é sucessor de 2

          k=2    vértice 2 não é sucessor de 2

          k=3    D[3] x D[2] + Custo[2,3] à ¥ x 2+3 à p=5  p<D[k]?  5<¥? Sim!!

                    Rota[3]=2, Dist[3]=5        

                    Rota[1,1,2,1,1] e Dist[0,2,5, ¥,10]

          k=4    4 não é sucessor de 2 

          k=5    D[5] x D[2] + Custo[2,5] à 10 x 2+7 à p=9  p < D[k]? 9 < 10? Sim!

                    Rota[5]=2, Dist[5]=9

                    Rota[1,1,2,1,2] e Dist[0,2,5, ¥,9]

 

a = 3, k=1    vértice 1 não é sucessor de 3

          k=2    vértice 2 não é sucessor de 3

          k=3    vértice 3 não é sucessor de 3

          k=4    D[4] x D[3] + Custo[3,4] à ¥ x 5+4 à p=9  p < D[4]? 9 < ¥? Sim!

                    Rota[4]=3, Dist[4]=9

                    Rota[1,1,2,3,2] e Dist[0,2,5, 9,9]

          k=5    vértice 5 não é sucessor de 3

 

a = 4, k=1    vértice 1 não é sucessor de 4

          k=2    vértice 2 não é sucessor de 4

          k=3    vértice 3 não é sucessor de 4

          k=4    vértice 4 não é sucessor de 4

          k=5    vértice 5 não é sucessor de 4

 

a = 5, k=1    vértice 1 não é sucessor de 5

          k=2    vértice 2 não é sucessor de 5

          k=3    D[3] x D[5] + Custo[5,3] à 5 x 9+8 à p=5 p < D[3]? 5 < 5? Não!

          k=4    D[4] x D[5] + Custo[5,4] à 9 x 9+5 à p=9 p < D[4]? 9 < 9? Não!

          k=5    vértice 5 não é sucessor de 5

 

Assim, no final temos:

Rota[1,1,2,3,2] e Dist[0,2,5,9,9].

Exercício 1 – Para o mesmo grafo, repita o procedimento acima, mas considerando que o vértice inicial é o vértice 2.

Exercício 2 – Para o seguinte grafo, aplique o algoritmo “passo a passo”, de forma a descobrir a matriz de rota e a matriz de custo mínimo. Considere que o vértice 1 é  vértice inicial. Determine então a pista do vértice 1 para todos os outros vértices

 

 

                                   2                      1                                 3                                         

                                                                                    

                  10                                                            

            1                 3         2                            9           4           6       

                                                               

 

                         5                                                7

                                                                 

                                   5                         2                               4