Maison >développement back-end >Tutoriel Python >Comment implémenter l'algorithme Floyd-Warshall en utilisant Python ?
Comment implémenter l'algorithme Floyd-Warshall en utilisant Python ?
L'algorithme Floyd-Warshall est un algorithme classique utilisé pour résoudre le problème du chemin le plus court de tous les points sources à tous les points de destination. Il s'agit d'un algorithme de programmation dynamique qui peut être utilisé pour traiter des graphiques orientés ou des problèmes de bords de poids négatifs. Cet article expliquera comment utiliser Python pour implémenter l'algorithme Floyd-Warshall et fournira des exemples de code spécifiques.
L'idée principale de l'algorithme Floyd-Warshall est de mettre à jour progressivement le chemin le plus court entre les nœuds en parcourant tous les nœuds du graphique, en utilisant chaque nœud comme nœud intermédiaire. Nous pouvons utiliser une matrice bidimensionnelle pour stocker la distance entre les nœuds du graphique.
Tout d'abord, nous devons définir une fonction pour implémenter l'algorithme Floyd-Warshall. Ce qui suit est un cadre d'algorithme simple :
def floydWarshall(graph): dist = graph num_vertices = len(graph) for k in range(num_vertices): for i in range(num_vertices): for j in range(num_vertices): dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]) return dist
Ce code utilise trois boucles imbriquées pour traiter chaque nœud du graphique. A chaque itération, nous trouvons des chemins plus courts en mettant à jour la matrice de distance. Plus précisément, nous vérifierons si le chemin du nœud i au nœud j peut atteindre une distance plus courte via le nœud k. Si tel est le cas, nous mettons à jour la valeur dans la matrice de distance.
Avant d'utiliser cette fonction, nous devons définir un graphique. Voici la définition d'un exemple de graphe :
graph = [ [0, float('inf'), -2, float('inf')], [4, 0, 3, float('inf')], [float('inf'), float('inf'), 0, 2], [float('inf'), -1, float('inf'), 0] ]
Cet exemple de graphe est une représentation matricielle de contiguïté d'un graphe orienté. Parmi eux, float('inf')
signifie que la distance est infinie, ce qui signifie qu'il n'y a pas de connexion directe entre les deux nœuds. float('inf')
表示距离为无穷大,这意味着两个节点之间没有直接连接。
下面,我们调用floydWarshall
函数,传入图作为参数,并打印最终的结果:
result = floydWarshall(graph) for row in result: print(row)
完整的代码如下:
def floydWarshall(graph): dist = graph num_vertices = len(graph) for k in range(num_vertices): for i in range(num_vertices): for j in range(num_vertices): dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]) return dist graph = [ [0, float('inf'), -2, float('inf')], [4, 0, 3, float('inf')], [float('inf'), float('inf'), 0, 2], [float('inf'), -1, float('inf'), 0] ] result = floydWarshall(graph) for row in result: print(row)
运行上述代码,你会得到以下输出:
[0, -1, -2, 0] [4, 0, 2, 4] [5, 1, 0, 2] [3, -1, 1, 0]
输出的结果是一个二维矩阵,表示图中任意两个节点之间的最短路径。例如,result[0][2]
floydWarshall
, passons le graphique en paramètre et imprimons le résultat final : rrreee
Le code complet est le suivant : 🎜rrreee🎜Exécutez le code ci-dessus, vous obtiendra le résultat suivant : 🎜 Le résultat de sortie de rrreee🎜 est une matrice bidimensionnelle représentant le chemin le plus court entre deux nœuds quelconques du graphique. Par exemple, la valeur deresult[0][2]
est -2, ce qui signifie que le chemin le plus court entre le nœud 0 et le nœud 2 est -2. Si deux nœuds sont inaccessibles, la distance est marquée comme infinie. 🎜🎜A travers cet exemple, nous pouvons clairement comprendre la mise en œuvre et l'utilisation de l'algorithme Floyd-Warshall. J'espère que cet article pourra vous aider à comprendre et à appliquer cet algorithme ! 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!