弗洛伊德算法不能用于带有负权回路的负权值带权图,但可以用于不带负权回路的负权值带权图。 实现代码: #include<iostream> using namespace std; //多源最短路径(Floyd算法) #define inf 0x3f3f3f const int N = 155; int G[N][N]; //图 int n, m; //顶点数 边数 int path[N][N]; //记录路径 //弗洛伊德算法 void floy() { for (int k = 0;k < n;k++) { //中转点 for (int i = 0;i < n;i++) { //起点 for (int j = 0;j < n;j++) { //终点 if (G[i][k] + G[k][j] < G[i][j]) { //求以k为中转点的两点间的最短距离 G[i][j] = G[i][k] + G[k][j]; path[i][j] = path[i][k]; //记录路径 } } } } } int main() { cin >> n >> m; //初始化无向图 for (int i = 0;i < n;i++) { for (int j = 0;j < n;j++) { if (i == j) { G[i][j] = 0; G[j][i] = 0; } else { G[i][j] = inf; G[j][i] = inf; } path[i][j] = j; path[j][i] = i; } } //构建无向图 for (int i = 0;i < m;i++) { int x, y,w; //边 cin >> x >> y>>w; G[x][y] = w; G[y][x] = w; } floy(); //弗洛伊德算法 for (int i = 0;i < n;i++) { //输出顶点0到各点的最短路径长度 printf("从0号顶点到达顶点%d的最短路径长度为:%d,", i, G[0][i]); //输出路径 int z = path[0][i]; cout <<"路径为:"<<0; while (z != i) { cout << "->" << z; z = path[z][i]; } cout << "->" << i << endl; } return 0; } /* 输入样例: 5 7 0 1 2 1 4 3 4 3 3 0 2 5 2 3 7 0 3 6 0 4 7 输出样例: 从0号顶点到达顶点0的最短路径长度为:0,路径为:0->0 从0号顶点到达顶点1的最短路径长度为:2,路径为:0->1 从0号顶点到达顶点2的最短路径长度为:5,路径为:0->2 从0号顶点到达顶点3的最短路径长度为:6,路径为:0->3 从0号顶点到达顶点4的最短路径长度为:5,路径为:0->1->4 */ 运行结果: