佛洛依德算法算法作为一个经典的求最短路径的算法,思路其实很简单,就是不停地进行“松弛操作”,直到全部遍历一遍。那么什么是松弛操作呢?比如说我们的图存在一个邻接矩阵graph中,graph[v][u]为顶点v到顶点u的路径长度,松弛操作就是寻找一个中间节点k,使graph[v][u]>graph[v][k]+graph[k][u],若得到此关系,说明通过这个中间节点可以减小v和u之间的距离,所以我们更新距离,graph[v][u]=graph[v][k]+graph[k][u],一直重复操作,直到所有中间节点k,所有v和u都被遍历到,此时循环结束,graph数组里的就是各节点间的最小距离,核心代码如下:
for (int k = 0; k < size; k++)
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
if (graph[i][j] > graph[i][k] + graph[k][j])
{
graph[i][j] = graph[i][k] + graph[k][j];
}
}
}
}
全部的代码如下,节点数可自行更改:
#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;
void InputGraph(vector<vector<int>> &graph) //输入权值,否则为无穷大
{
int count = 0;
cin >> count;
int size=graph.size();
for (int i = 0; i < size; i++)
{
graph[i][i] = 0;
}
for (int i = 0; i < count; i++)
{
int start = -1, end = -1, weight = 0;
cin >> start >> end >> weight;
graph[start][end] = weight;
}
}
void Floyd(vector<vector<int>> &graph) //使用佛洛依德算法求最短路径长度
{
int size = graph.size();
for (int k = 0; k < size; k++)
{
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
if (graph[i][j] > graph[i][k] + graph[k][j])
{
graph[i][j] = graph[i][k] + graph[k][j];
}
}
}
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
cout <<setw(6)<< graph[i][j] << " ";
}
cout << endl;
}
}
int main()
{
vector<vector<int>> graph = vector<vector<int>>(5, vector<int>(5, 999999));
InputGraph(graph);
Floyd(graph);
system("pause");
return 0;
}