题意 给你一个无向图的邻接矩阵 和途径每个点需要的额外花费首尾没有额外花费 求图中某两点之间的最短路并打印字典序最小路径
要求多组点之间的就用floyd咯 打印路径也比较方便 nex[i][j]表示从i点到j点最短路的第一个途经点 那么如果路径中加入一个节点k后 nex[i][j]应该更新为nex[i][k] 因为要途径k了
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 100,INF=0x3f3f3f;
int cost[N][N], tax[N], nex[N][N];
int s, t, n;
void floyd()
{
int tmp;
for(int k = 1; k <= n; ++k)
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
{
tmp = cost[i][k] + cost[k][j] + tax[k];
if(cost[i][j] > tmp || (cost[i][j] == tmp && nex[i][j] > nex[i][k]))
{
nex[i][j] = nex[i][k];
cost[i][j] = tmp;
}
}
}
int main()
{
while(scanf("%d", &n), n)
{
memset(nex,0,sizeof(nex));
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
{
scanf("%d", &cost[i][j]);
if(cost[i][j] < 0) cost[i][j]=INF;
else nex[i][j]=j;
}
}
for(int i = 1; i <= n; ++i) scanf("%d", &tax[i]);
floyd();
while(scanf("%d%d", &s, &t), s > 0)
{
int k=s;
printf("From %d to %d :\nPath: %d", s, t, s);
while(k!=t) printf("-->%d", k=nex[k][t]);
printf("\nTotal cost : %d\n\n", cost[s][t]);
}
}
return 0;
}5 0 3 22 -1 4 3 0 5 -1 -1 22 5 0 9 20 -1 -1 9 0 4 4 -1 20 4 0 5 17 8 3 1 1 3 3 5 2 4 -1 -1 0
From 1 to 3 : Path: 1-->5-->4-->3 Total cost : 21 From 3 to 5 : Path: 3-->4-->5 Total cost : 16 From 2 to 4 : Path: 2-->1-->5-->4 Total cost : 17
HDU 1385 Minimum Transport Cost (字典序打印最短路)
原文地址:http://blog.csdn.net/acvay/article/details/40616925