全源最短路径(Floyd算法)

#include <iostream>
#include <cstring>
#include <cstdio>

#define maxn 500
#define INF 60000

using namespace std;

int map[maxn][maxn]; //图
// bool vis[maxn]; //访问设置
int dis[maxn][maxn]; //比如dis[i][i],从i到j的最短距离
int path[maxn][maxn]; //记录路径
int n, m; //n个顶点,m条边。顶点从0开始编号

void Floyd() //佛洛依德算法
{
for (int i = 0; i < n; ++i) //初始化dis数组和路径
{
for (int j = 0; j < n; ++j)
{
dis[i][j] = map[i][j];
if (i != j && dis[i][j] < INF)
{
path[i][j] = i; // 记录 i 到 j 的前一个节点编号
}
else
path[i][j] = 0;
}
}
for (int k = 0; k < n; k++) //注意k,i,j的嵌套顺序
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (dis[i][j] > dis[i][k] + dis[k][j])
{
dis[i][j] = dis[i][k] + dis[k][j];
path[i][j] = path[k][j];
}
}
}
}
}

void printPath(int S, int E)
{
//路径回溯
int temp = path[S][E];
cout << E;
while (true)
{
if (temp == S)
{
cout << "<--" << S << endl;
break;
}
cout << "<-" << path[S][temp];
temp = path[S][temp];
}
}

int main()
{

return 0;
}
人生如修仙,岂是一日间。何时登临顶,上善若水前。
原文地址:https://www.cnblogs.com/f-society/p/15267276.html