1. 题目
示例输入
4
0 2 10 10000
2 0 7 3
10 7 0 6
10000 3 6 0
2
0 2
3 0
示例输出
9
5
2. 思路
Floyd算法容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。
弗洛伊德算法定义了两个二维矩阵:
- 矩阵D记录顶点间的最小路径
- 矩阵P记录顶点间最小路径中的中转点
它通过3重循环,k为中转点,v为起点,w为终点,循环比较D[v][w] 和 D[v][k] + D[k][w] 最小值,如果D[v][k] + D[k][w] 为更小值,则把D[v][k] + D[k][w] 覆盖保存在D[v][w]中。
3. 代码
#include <iostream>
using namespace std;
typedef struct{
int n;
int Edge[100][100];
}Graph;
Graph G;
void createGraph(){
cin >> G.n;
for(int i=0; i<G.n; i++){
for(int j=0; j<G.n; j++){
cin >> G.Edge[i][j];
}
}
}
void Floyd(){
int n = G.n;
for(int k=0; k<n; k++){
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
G.Edge[i][j] = min(G.Edge[i][j], G.Edge[i][k] + G.Edge[k][j]);
}
}
}
}
int main(int argc, char** argv) {
createGraph();
int n, s, t;
Floyd();
cin >> n;
for(int i=0; i<n; i++){
cin >> s >> t;
cout << G.Edge[s][t] << endl;
}
return 0;
}