HDU1385 Minimum Transport Cost 最短路+输出路径★floyd中的路径dp

来源:互联网 发布:java traceid 追踪 编辑:程序博客网 时间:2024/06/06 20:17

题意:给定有向图,输出s->t ,的最短路权值,和权值最小下字典序最小的路径

思路:floyd,dp[][]扩展到路径字典序上

#include"stdio.h"#include"string.h"int n;int tax[111];int map[111][111];int path[111][111];void floyd(){    int temp;    int k,i,l;    for(i=1;i<=n;i++)    for(l=1;l<=n;l++)        path[i][l]=l;    for(k=1;k<=n;k++)    {        for(i=1;i<=n;i++)        {            for(l=1;l<=n;l++)            {                temp=map[i][k]+map[k][l]+tax[k];                if(temp<map[i][l])                {                    map[i][l]=temp;                    path[i][l]=path[i][k];                }                else if(temp==map[i][l])                {                    if(path[i][l]>path[i][k])                        path[i][l]=path[i][k];                }            }        }    }}int main(){    int i,l;    int temp;    int s,e;    while(scanf("%d",&n),n)    {        for(i=1;i<=n;i++)        for(l=1;l<=n;l++)        {            scanf("%d",&temp);            if(temp==-1)    map[i][l]=11111111;            else            map[i][l]=temp;        }        for(i=1;i<=n;i++)    scanf("%d",&tax[i]);        floyd();        while(scanf("%d%d",&s,&e)!=-1)        {            if(s==-1 && e==-1)    break;            printf("From %d to %d :\n",s,e);            printf("Path: %d",s);            temp=s;            while(temp!=e)            {                printf("-->%d",path[temp][e]);                temp=path[temp][e];            }            printf("\n");            printf("Total cost : %d\n\n",map[s][e]);        }    }    return 0;}



0 0