Floyd算法描述
变量:w[i][j] 表示从i到j的路径,dis[i][j]表示从i到j的最短路径。
初始化:若 i 到 j 有边相连,则初始化 dis[i][j] == w[i][j] ,否者初始化为0x7fffffff;
int n; // n代表n*n的矩阵
int w[1005][1005];
int dis[1005][1005];
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> w[i][j];
if (w[i][j] == 0) {
dis[i][j] = 0x7fffffff;
} else {
dis[i][j] = w[i][j];
}
}
}
核心代码:
void floyd() {
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (dis[i][j] > dis[i][k] + dis[k][j]) {
dis[i][j] = dis[i][k] + dis[k][j];
}
}
}
}
}
分析
其实这个就可以理解为DP,真的非常像,Floyd算法不仅可以处理正的权问题,负的问题也可以处理,而且,最重要的一点!代码简单awa!
溜啦~