HDU 1385 Minimum Transport Cost(最短路Floyd+标记路径)

来源:互联网 发布:ios最简单的链式编程 编辑:程序博客网 时间:2024/05/20 06:24

题目大意:给定n个城市,及其之间的距离,然后有一行数,代表在每个城市中所需要的过路费。求任意两点间的

最小费用,及其经过的路径。


#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <queue>#define inf 0x3f3f3f3f#define ll long longusing namespace std;int Map[1000][1000],n,path[1000][1000],b[1000];void Floyd(){    int i,j,k;    for(k=1;k<=n;k++)        for(i=1;i<=n;i++)            for(j=1;j<=n;j++)            {                if(Map[i][j]>Map[i][k]+Map[k][j]+b[k])                {                    Map[i][j]=Map[i][k]+Map[k][j]+b[k];                    path[i][j]=path[i][k];//更新路径                }                else if(Map[i][j]==Map[i][k]+Map[k][j]+b[k])                {                    path[i][j]=min(path[i][k],path[i][j]);                }            }}int main(){    int m,i,j,k,x,y;    while(~scanf("%d",&n))    {        if(!n)  break;        for(i=1;i<=n;i++)            for(j=1;j<=n;j++)            {                scanf("%d",&k);                if(k==-1)                    Map[i][j]=inf;                else                {                    Map[i][j]=k;path[i][j]=j;//用path[][]数组记录下某个当前路径                }            }        for(i=1;i<=n;i++)            scanf("%d",&b[i]);        Floyd();int tmp;        while(~scanf("%d%d",&x,&y))        {            if(x==-1&&y==-1)                break;            tmp=path[x][y];            printf("From %d to %d :\n",x,y);            printf("Path: %d",x);            if(x==y)                printf("\nTotal cost : %d\n\n",Map[x][y]);            else            {                while(1)                {                    printf("-->%d",tmp);                    if(tmp==y)   break;                    tmp=path[tmp][y];                }                printf("\nTotal cost : %d\n\n",Map[x][y]);            }        }    }    return 0;}


0 0
原创粉丝点击