题意:运输货物,从一个地方到另一个地方所需要的最小花费。中途经过的城市还要交税费,只有起点和终点不用交。并记录运输所走过的路径,在运费相同时输出字典序的路径,也就是最小的路径(当不是最短的路径)。

连接: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;
}