O algoritmo de Dijkstra também é conhecido como o mais curto algoritmo de caminho possível. É o procedimento encontrar o caminho mais curto entre os nós/ bordas do gráfico. O gráfico mais curto de uma árvore é criado começando do vértice da fonte para todos os outros pontos do gráfico.
Algoritmo
Implementação do algoritmo de gráfico de Dijkstra
Aqui está a implementação do gráfico Dijkstra, onde um programa é escrito para a representação da matriz de adjacência desse gráfico. Inicie o programa adicionando duas bibliotecas muito essenciais para a realização do programa na linguagem de programação C ++, que nos torna capazes de usar os recursos CIN e Cout.
#incluir
#incluir
Depois de descrever as bibliotecas, agora forneceremos o tamanho ou vértices do gráfico em que precisamos do caminho mais curto. Damos 9 vértices, o que significa que a matriz é um quadrado de [9] [9].
#Define v 9
"V" é para os vértices. Como o algoritmo requer muitas etapas para realizar a tarefa fornecida, cada etapa ou processo é dividida em funções separadas para executá -las para que o código seja claro e não haja ambiguidade em relação à lógica. Além disso, a complexidade também é removida.
A função é criada aqui para pesquisar o vértice que possui um valor de distância mínimo; Ele contém o conjunto de vértices que não estão incluídos na árvore com o caminho mais curto. A função conterá a matriz de distância e um sptsset do tipo bool, o conjunto de árvores de caminho mais curto e a matriz como um parâmetro da função. Dentro da função, o valor mínimo é inicializado declarando uma variável de tipo inteiro que armazenará o valor retornado. Duas variáveis, Max e o min_index são introduzidas.
Int min = int_max, min_index;
A for loop é usado aqui; em que um vértice inicial em todos os vértices é tomado, o loop continuará até que todos os vértices sejam atravessados. Uma condição é aplicada aqui usando uma declaração IF que verifica se o conjunto de caminho mais curto é falso meios, está vazio agora e a distância do vértice é menor que a do valor mínimo do vértice, que é declarado anteriormente, Em seguida, aloque o valor atual do vértice como min, e o min_index também conterá o mesmo valor do vértice.
Min = dist [v], min_index = v;
Depois que o valor mínimo do vértice é calculado, o próximo é o processo de criação de uma função que exibirá a matriz de distância que foi construída anteriormente. Um loop irá iterar cada índice que será acessado e exibido. Primeiro, o número do vértice é exibido a partir do valor zero, e a distância do vértice da fonte também é mencionada aqui com uma sequência. Esta função é declarada aqui, mas será chamada mais adiante no programa, quando todo o caminho for calculado como a menor distância.
A parte principal de todo o código-fonte é declarada agora, onde a implementação do caminho mais curto de fonte única é calculada. Um gráfico será representado pela representação da matriz de adjacência. Esta função levará uma matriz gráfica e a fonte como valores de parâmetros que atuarão como entrada para o cálculo da distância. Primeiro, dentro da função, declararemos a matriz de saída que conterá o caminho mais curto da fonte para um ponto específico. Em segundo lugar, é declarada uma matriz variável booleana, o que retornará verdadeiro se o vértice for incluído na determinação do caminho mais curto no início.
Int dist [v]; SPTSET BOOL [V];
Todas as distâncias serão definidas como infinitas, e a matriz de caminho mais curta é falsa. Com a ajuda de um loop, todo esse processo ocorrerá.
Dentro do loop, o vértice de distância mínima é escolhido no conjunto de vértices que ainda não foram processados. Na primeira iteração, 'u' é sempre igual ao vértice da fonte.
Int u = Mindistância (Dist, sptset);
Os vértices escolhidos e percorridos são colhidos e marcados como processados ao definir a variável booleana é verdadeira.
sptset [u] = true;
Quando um vértice é adicionado, todos os vértices adjacentes a esse vértice em particular também são verificados; Isso precisa de uma atualização. Portanto, atualizaremos o valor de "distiço" dos vértices adjacentes daqueles vértices que foram piquetes até agora.
Dentro disso, para o loop, atualizaremos dist [v] se e somente se não estiver no sptset, existe uma linha chamada uma vantagem do vértice u a V, e o peso total do caminho que começa a partir de "src" Para "V", passando por "U" é menor que o valor atual presente no disto [v].
Dist [v] = dist [u] + gráfico [u] [v];
Depois disso, a função de impressão que declaramos acima é chamada passando a matriz dist [] como um parâmetro.
PrintSolution (Dist);
No programa principal, criamos um gráfico de 9*9 matrizes. E então, a função chama a função Dijkstra é feita, através da qual o gráfico é passado.
Salve o código inteiro. Compilar o código usando um compilador G ++ no terminal Ubuntu. '-o' é um símbolo que salva a saída do arquivo.
$ g ++ -o dij dij.c
$ ./dij
Você pode ver que todos os vértices em cada linha separada são exibidos junto com a distância de cada vértice da fonte.
Este código ajuda a calcular a menor distância, mas não suporta calcular as informações sobre o caminho. Esse código -fonte é bom para os gráficos não direcionados, mas pode ser possível usar para os gráficos direcionados também. Ao usar este código, podemos encontrar a menor distância do ponto de fonte para todos os outros vértices no gráfico.
A complexidade do tempo do gráfico Dijkstra
Falaremos sobre a complexidade do tempo da implementação. Isso é:
0 (v^2).
Isso pode ser reduzido para 0 (e log V) usando o processo de heap binário. O gráfico Dijkstra não é para os gráficos que têm pesos negativos.
Conclusão
Este artigo contém o processo de encontrar a distância mais curta entre o nó de origem e o restante dos nós. Pode haver muitas abordagens para isso. Mas o gráfico Dijkstra é um dos melhores mecanismos para esse fim. Ele foi projetado para gráficos não direcionados. Explicamos o processo passo a passo com o código -fonte para torná -lo vívido para os novos usuários. Esperamos que esse esforço esteja à altura dos leitores.