hdu 1385 Minimum Transport Cost (Floyd 路径输出)

来源:互联网 发布:使用u盘安装linux系统 编辑:程序博客网 时间:2024/05/20 22:02

题目大意:给出邻接矩阵(-1表示无路),若节点i到j不能直达,则还需加上中间节点k的花费tax[k],求最短路并输出路径。

坑点:

1、没告诉取值范围。(数组瞎开到1000)

2、节点i到其自身的路径输出格式为:i,而不是i-->i

3、每个询问之后,输出一个空行。


#include <stdio.h>#include <cstring>#include <algorithm>using namespace std;#define inf 0x3f3f3f3f#define N 1005int A[N][N],path[N][N],n,tax[N];//用path[i][j]表示i到j的后继节点。比如:i->k->m->j,则path[i][j]=k,path[k][j]=m,path[m][j]=j。void init(){    memset(A,inf,sizeof(A));    memset(path,-1,sizeof(path));    for(int i=0; i<=n; ++i) A[i][i]=0;}void Floyd(){    for(int k=1; k<=n; ++k)        for(int i=1; i<=n; ++i)            for(int j=1; j<=n; ++j)                if(A[i][j]>=A[i][k]+A[k][j]+tax[k])                {                    if(A[i][j]==A[i][k]+A[k][j]+tax[k]) path[i][j]=min(path[i][j],path[i][k]);                    else path[i][j]=path[i][k];                    A[i][j]=A[i][k]+A[k][j]+tax[k];                }}void output(int s,int e){    int next=path[s][e];    printf("Path: %d",s);    while(next!=e){        printf("-->%d",next);        next=path[next][e];    }    printf("-->%d\n",e);}int main(){    int i,j,x;    while(~scanf("%d",&n)&&n)    {        init();        for(i=1; i<=n; ++i)            for(j=1; j<=n; ++j)            {                scanf("%d",&x);                if(x!=-1)                {                    A[i][j]=x;                    path[i][j]=j;                }            }        for(i=1; i<=n; ++i) scanf("%d",&tax[i]);        Floyd();        int s,e;        while(~scanf("%d%d",&s,&e))        {            if(s==-1&&e==-1) break;            printf("From %d to %d :\n",s,e);            if(s==e) printf("Path: %d\n",s);            else output(s,e);            printf("Total cost : %d\n",A[s][e]);            puts("");        }    }    return 0;}


0 0
原创粉丝点击