Índice
1. Introdução ao Algoritmo Dijkstra
2. Abaixo, use C# e PHP para implementar o código de exemplo do algoritmo de Dijkstra:
2.1 Usando C# para implementar o código de exemplo do algoritmo de Dijkstra (algoritmo de Dijkstra)
2.2 Usando PHP para implementar o código de amostra do algoritmo de Dijkstra (algoritmo de Dijkstra)
1. Introdução ao Algoritmo Dijkstra
O algoritmo de Dijkstra é um algoritmo para resolver o problema do caminho mais curto de fonte única em um grafo direcionado ponderado. Ele começa em um nó e calcula o caminho mais curto desse nó para todos os outros nós.
A ideia básica do algoritmo de Dijkstra é começar do ponto inicial, expandir gradualmente novos nós e tentar atualizar a distância dos nós expandidos ao ponto inicial através desses nós. Em cada expansão, selecione o nó não expandido que está atualmente mais próximo do ponto inicial da expansão e use a distância do nó ao ponto inicial para atualizar a distância do nó expandido ao ponto inicial. Este processo é repetido até que todos os nós tenham sido expandidos.
Para implementar este algoritmo, é necessário usar um array para registrar a distância de cada nó ao ponto inicial, um array para registrar se cada nó foi expandido e um array bidimensional para registrar o peso de cada aresta. no gráfico. A complexidade de tempo do algoritmo é O(V^2), onde V representa o número de nós.
O algoritmo de Dijkstra pode ser otimizado por uma fila de prioridade, reduzindo a complexidade do tempo para O(E log V), onde E representa o número de arestas. O nó com a menor distância do ponto inicial é armazenado na fila de prioridade, e o nó com a menor distância na fila de prioridade é selecionado para expansão cada vez que é expandido. Este algoritmo é conhecido como algoritmo de Dijkstra com implementação de fila prioritária.
Resumindo, o algoritmo de Dijkstra é um algoritmo eficiente e comumente usado para resolver o problema do caminho mais curto de fonte única e é amplamente utilizado em roteamento de rede, navegação em mapas e outros campos.
2. Abaixo, use C# e PHP para implementar o código de exemplo do algoritmo de Dijkstra:
2.1 Usando C# para implementar o código de exemplo do algoritmo de Dijkstra (algoritmo de Dijkstra)
A seguir está um exemplo de código que implementa o algoritmo de Dijkstra usando C#. Neste exemplo, usamos uma matriz bidimensional graph
para representar o grafo ponderado direcionado, onde graph[i][j]
representa o peso da aresta do nó i ao nó j; usamos uma matriz unidimensional dist
para registrar o menor comprimento do caminho de cada nó até o ponto inicial point; Use um array booleano visited
para registrar se cada nó foi visitado.
usando o sistema;
class DijkstraAlgorithmDemo
{ static void Main(string[] args) { int[][] gráfico = new int[][] { new int[] {0, 10, 3, int.MaxValue}, new int[] {int. MaxValue, 0, 1, 2}, novo int[] {int.MaxValue, 4, 0, 8}, novo int[] {int.MaxValue, int.MaxValue, int.MaxValue, 0} };
int startNode = 0;
int[] dist = new int[grafo.Comprimento];
bool[] visitado = novo bool[graph.Length];for (int i = 0; i < gráfico.Comprimento; i++)
{ dist[i] = int.MaxValue; visitado[i] = falso; }dist[startNode] = 0;
for (int contagem = 0; contagem < gráfico.Comprimento - 1; contagem++)
{ int u = MinDistance(dist, visitado);visitado[u] = verdadeiro;
for (int v = 0; v < gráfico.Comprimento; v++)
{ if (!visited[v] && gráfico[u][v] != int.MaxValue && dist[u] != int.MaxValue && dist[u ] + gráfico[u][v] < dist[v]) { dist[v] = dist[u] + gráfico[u][v]; } } }
Console.WriteLine("O caminho mais curto do nó ao ponto inicial:");
for (int i = 0; i < graph.Length; i++)
{ if (dist[i] == int.MaxValue) { Console.WriteLine($"{i} -> 起点: 不可达"); } else { Console.WriteLine($"{i} -> Exemplo: {dist[i]}"); } } }
static int MinDistance(int[] dist, bool[] visitado)
{ int minDist = int.MaxValue; int minIndex = -1;for (int v = 0; v < dist.Length; v++)
{ if (!visited[v] && dist[v] <= minDist) { minDist = dist[v]; índicemin = v; } }
return minIndex;
}
}
Neste código de exemplo, primeiro definimos uma matriz bidimensional graph
que representa um gráfico ponderado direcionado. Em seguida, um array unidimensional dist
e um array booleano visited
são definidos para registrar o comprimento do caminho mais curto de cada nó até o ponto inicial e se o nó foi visitado. A seguir, inicializamos dist
o array e visited
o array e definimos a distância do ponto inicial como 0.
A seguir, usamos um loop para expandir cada nó por vez e atualizar sua distância da origem. Em cada expansão, selecionamos o nó não expandido que está atualmente mais próximo do ponto inicial da expansão e usamos a distância do nó ao ponto inicial para atualizar a distância do nó expandido ao ponto inicial. Quando todos os nós foram expandidos, dist
o comprimento do caminho mais curto de cada nó até o ponto inicial é registrado na matriz.
Finalmente, geramos o comprimento do caminho mais curto de cada nó até a origem no console.
2.2 Usando PHP para implementar o código de amostra do algoritmo de Dijkstra (algoritmo de Dijkstra)
A seguir está um exemplo de implementação de código do algoritmo de Dijkstra usando PHP. Neste exemplo, usamos uma matriz bidimensional $graph
para representar o grafo ponderado direcionado, onde $graph[$i][$j]
representa o peso da aresta do nó i ao nó j; usamos uma matriz unidimensional $dist
para registrar o menor comprimento do caminho de cada nó até o ponto inicial point; Use um array booleano $visited
para registrar se cada nó foi visitado.
<?php
$gráfico = array(
array(0, 10, 3, INF),
array(INF, 0, 1, 2),
array(INF, 4, 0, 8),
array(INF, INF, INF, 0)
);$startNode = 0;
$dist = array();
$visitado = array();for ($i = 0; $i < contagem($gráfico); $i++) { $dist[$i] = INF; $visitado[$i] = falso; }
$dist[$startNode] = 0;
for ($count = 0; $count < count($graph) - 1; $count++) { $u = minDistance($dist, $visited);
$visitado[$u] = verdadeiro;
for ($v = 0; $v < contagem($graph); $v++) { if (!$visited[$v] && $graph[$u][$v] != INF && $dist[$u] != INF && $dist[$u] + $graph[$u][$v] < $dist[$v]) { $dist[$v] = $ dist[$u] + $graph[$u] [$v]; } } }
echo "O caminho mais curto do nó até o ponto inicial:\n";
for ($i = 0; $i < count($graph); $i++) { if ($dist[$i] == INF) { echo "$i -> 起点: 不可达\n"; } else { echo "$i -> 起点: {$dist[$i]}\n"; } }
function minDistance($dist, $visitado) { $minDist = INF; $minIndex = -1;
for ($v = 0; $v < contagem($dist); $v++) { if (!$visited[$v] && $dist[$v] <= $minDist) { $minDist = $dist[$v ]; $minIndex = $v; } }
return $minIndex;
}?>
Neste código de exemplo, primeiro definimos uma matriz bidimensional $graph
que representa um gráfico ponderado direcionado. Em seguida, um array unidimensional $dist
e um array booleano $visited
são definidos para registrar o comprimento do caminho mais curto de cada nó até o ponto inicial e se o nó foi visitado. A seguir, inicializamos $dist
o array e $visited
o array e definimos a distância do ponto inicial como 0.
A seguir, usamos um loop para expandir cada nó por vez e atualizar sua distância da origem. Em cada expansão, selecionamos o nó não expandido que está atualmente mais próximo do ponto inicial da expansão e usamos a distância do nó ao ponto inicial para atualizar a distância do nó expandido ao ponto inicial. Quando todos os nós foram expandidos, $dist
o comprimento do caminho mais curto de cada nó até o ponto inicial é registrado na matriz.
Finalmente, geramos o comprimento do caminho mais curto de cada nó até a origem no console.