hdoj 1385 输出 最短路的最小字典序路径

来源:互联网 发布:tcl l32f3300b 网络 编辑:程序博客网 时间:2024/05/16 13:03

#include<stdio.h>#include<string.h>#define inf 99999999int a[201][201];int path[201][201];int b[201],n;void init(){    int i,j;    for(i=1;i<=n;i++)        for(j=1;j<=n;j++)            path[i][j]=j;}int main(){        while(scanf("%d",&n),n)    {        int i,j,c,d,k,x;        for(i=1;i<=n;i++)          for(j=1;j<=n;j++)          {              scanf("%d",&a[i][j]);              if(a[i][j]==-1)                  a[i][j]=inf;          }        for(i=1;i<=n;i++)            scanf("%d",&b[i]);        init();        for(k=1;k<=n;k++)            for(i=1;i<=n;i++)                for(j=1;j<=n;j++)                {                    if(a[i][j]>a[i][k]+a[k][j]+b[k])                    {                        a[i][j]=a[i][k]+a[k][j]+b[k];                        path[i][j]=path[i][k];                    }                    else if(a[i][j]==a[i][k]+a[k][j]+b[k]&&path[i][j]>path[i][k])                    {                        path[i][j]=path[i][k];//这里path[path[i][k]][j]=...=j                    }                }        while(scanf("%d%d",&c,&d)==2)        {            if(c==-1&&d==-1)                break;            printf("From %d to %d :\n",c,d);            printf("Path: ");            x=c;            printf("%d",c);            while(x!=d)            {                printf("-->%d",path[x][d]);                x=path[x][d];            }            printf("\nTotal cost : %d\n\n",a[c][d]);        }    }        return 0;}

用邻接矩阵记录路径,用二维的可以保留每段路的开头

或结尾,初始化path[i][j]=j;


0 0
原创粉丝点击