8.1.3 蓝桥杯图论之Floyd与Dijkstra算法
在蓝桥杯等算法竞赛中,图论问题占据了重要地位,其中路径查找是一个经常出现的主题。Floyd-Warshall算法和Dijkstra算法是解决图中最短路径问题的两种经典算法。本篇博客将介绍这两种算法的原理和实现,以及它们的应用场景。
Floyd-Warshall算法
Floyd-Warshall算法是一种计算图中所有最短路径的动态规划算法。它能够处理包括负权边的图,但不能处理有负权环的图。算法的核心思想是逐步检查所有顶点对,考虑是否通过一个中间顶点来缩短当前的最短路径。
算法原理
- 初始化距离矩阵,对于每一对顶点,如果它们之间有边直接相连,则距离为边的权重,否则距离为无穷大。
- 通过三重循环,逐步尝试将每一个顶点作为中间点,更新其他所有顶点对之间的最短距离。
C++实现
#include <iostream>
#include <vector>
using namespace std;
#define INF 99999
#define V 4
void printSolution(int dist[][V]);
void floydWarshall(int graph[][V]) {
int dist[V][V], i, j, k;
for (i = 0; i < V; i++)
for (j = 0; j < V; j++)