Floyd-warshall算法(多源最短路径)
这种算法通常用于求一个点到其余多个点的最短距离
下面的代码是求1这个顶点到其余5个顶点的最短距离:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int main() {
int m, n, e[10][10];
int inf = 999999999;
int dis[10];
cin >> m >> n;
for (int i = 1; i <= m; i++)
for (int j = 1; j <= m; j++)
if (i == j) e[i][j] = 0; //自己到自己的距离初始化为0
else e[i][j] = 999999999;
//初始化点之间的边
int a = 0, b = 0, c = 0;
for (int i = 1; i <= n; i++) {
cin >> a >> b >> c;
e[a][b] = c;
}
//初始化dis数组,dis数组保存的是1号定点到各点之间的最短距离
for (int i = 1; i <= m; i++)
dis[i] = e[1][i];
int book[10] = { 0 };
//标记1号定点最短距离已经确定
book[1] = 1;
int Min = 0;
int u = 0;
//以下为Dijkstra算法核心语句
//在未确定到1的最短距离为多少的点中 寻找到顶点1最近的点
for (int i = 1; i <= n - 1; i++) {
Min = inf;
for(int j=1;j<=m;j++)
if (book[j] == 0 && dis[j] < Min) { //未确定最短距离且小于当前最小值 重点是更新u值
Min = dis[j];
u = j;
}
book[u] = 1;//标记u为已经确定最短距离(u当前正在松弛的点)
//以u为起点对其他点进行拓展,v为1~n
for (int v = 1; v <= m; v++) {
if (e[u][v] < inf)
if (dis[v] > dis[u] + e[u][v])
dis[v] = dis[u] + e[u][v];
}
}
for (int i = 1; i <= m; i++)
cout << dis[i] << " ";
system("pause");
return 0;
}