#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int M = 1000;
const int MAX = 999999;
int dist[M][M];
int b[M];
int road[M][M];
int s, e;
int n;
//网上肯看,没想到, 惭愧啊!
void floyd() {
for(int i = 1; i <= n; i++) { //初始化能到大的点;
for(int j = 1; j <= n; j++) {
road[i][j] = j;
}
}
for(int k = 1; k <= n; k++) { //算出任意两点的最小费用,
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
int sum = dist[i][k] + dist[k][j] + b[k];
if(dist[i][j] > sum) {
dist[i][j] = sum;
road[i][j] = road[i][k];
}
else if(sum == dist[i][j] && road[i][j] > road[i][k]) { //求最小字典树;
road[i][j] = road[i][k];
}
}
}
}
}
int main()
{
while(scanf("%d", &n) != EOF && n) {
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
scanf("%d", &dist[i][j]);
if(dist[i][j] == -1)
dist[i][j] = MAX;
}
}
for(int i = 1; i <= n; i++){
scanf("%d", &b[i]);
}
floyd();
while(scanf("%d%d", &s, &e)) {
if(s == -1 && e == -1)
break;
printf ("From %d to %d :\n", s, e);
printf ("Path: %d", s);
int lu = s;
while(s != e) {
printf ("-->%d", road[s][e]);
s = road[s][e];
}
printf ("\nTotal cost : %d\n\n", dist[lu][e]);
}
}
return 0;
}
hdu1385 Minimum Transport Cost(路径输出)
最新推荐文章于 2021-05-08 20:17:13 发布
本文介绍了一个基于Floyd算法实现的程序,该程序用于解决任意两点之间的最短路径问题,并通过输入距离矩阵和中间节点费用来计算最小总成本及最优路径。文章通过具体的代码示例展示了如何初始化矩阵、进行迭代计算以及输出最终结果。
517

被折叠的 条评论
为什么被折叠?



