应用:求图中任意两点的最短路径
任意两点之间的距离最短要么为直达路径要么为经过某个中间节点的路径。
定义 结构体储存 line:任意两点的最短距离
path: 路径上的前一个点
初始化 line 其全部为最大值INT_MAX (代表无穷大),使path为当前的起点。
对于任意一个节点v,判读是否存在g[i][v].line+g[v][j].line<g[i][j].line,其中i,j满足:
i 不等于v,j不等于v,i不等于j
若满足则更新g[i][j].line的值:g[i][j].line=g[i][v].line+g[v][j].line;
同时修改g[i][j].path=v(表示由i到j经过v的路径比i到j的直达路径更短)
有总体最优则局部必最优可知,得到任意图中两点的最短路径则中途任意两点路径也是最短的,则通过path可还原最短路径。
#include<iostream>
using namespace std;
#define max 1000
struct inform {
int line=INT_MAX;
int path;
}g[max][max];
int main() {
int I, J, L, N, M;
cin >> N >> M;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
g[i][j].path = i;
}
for (int i = 0; i < M; i++) {
cin >> I >> J >> L;
g[I][J].line = L;
}
for (int v = 0; v < N; v++) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (i != v && j != v && i != j) {
if (g[i][v].line == INT_MAX || g[v][j].line == INT_MAX)
continue;
else if (g[i][v].line + g[v][j].line < g[i][j].line) {
g[i][j].line = g[i][v].line + g[v][j].line;
g[i][j].path = v;
}
}
}
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
if (i != j)
cout << g[i][j].line << "/ " << g[i][j].path << " ";
else
cout << 0 << "/ " << g[i][j].path << " ";
cout << endl;
}
return 0;
}