题意:运输货物,从一个地方到另一个地方所需要的最小花费。中途经过的城市还要交税费,只有起点和终点不用交。并记录运输所走过的路径,在运费相同时输出字典序的路径,也就是最小的路径(当不是最短的路径)。
连接:http://acm.hdu.edu.cn/showproblem.php?pid=1385
解题思路:floyd算法,开一个数组(path)记录当前点上一个点的位置。在floyd算法中判断是否为节点最小的路径。
View Code
#include <iostream>// using namespace std; int map[110][110]; int path[110][110]; //#define INF 0x7ffffff int n; int tex[110]; int main() { while(scanf("%d",&n),n) { memset(map,-1,sizeof(map)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&map[i][j]); path[i][j]=j;//记录路径的数组 //path[i][j]=i; } } for(i=1;i<=n;i++) { scanf("%d",&tex[i]); } for(int k=1;k<=n;k++)//floyd算法 { for(int j=1;j<=n;j++) { for(int i=1;i<=n;i++) { if(map[j][k]!=-1/*&&map[j][i]!=-1*/&&map[k][i]!=-1) { int len=map[j][k]+map[k][i]+tex[k]; if(map[j][i]>len||map[j][i]==-1)//寻找最短路径 { map[j][i]=len; path[j][i]=path[j][k]; } else { if(map[j][i]==len)//当两个点到当前点的路一样时,找最小的路径 { if(path[j][i]>path[j][k]) { path[j][i]=path[j][k]; } } } } } } } int a; int b; int type=0; while(1) { if(type++) { printf("\n"); } scanf("%d%d",&a,&b); if(!(a+b+2)) { break; } printf("From %d to %d :\n",a,b); printf("Path: %d",a); k=a; while(k!=b) { printf("-->%d",path[k][b]); k=path[k][b]; } printf("\n"); printf("Total cost : %d\n",map[a][b]); } } return 0; }