hdu1385Floyd 记忆路径

来源:互联网 发布:人工智能免费观看神马 编辑:程序博客网 时间:2024/05/16 14:58


题意:求从i到j的最短路径长度,以及字典序最小的路径。

#include <iostream>#include <cstdio>using namespace std;int a[110][110],c[110][110];int b[110];int find(int from,int to){    while(c[from][to]!=to)    {        printf("-->%d",c[from][to]);        from=c[from][to];    }    printf("-->%d\n",to);    return 0;}int main(){    int n,i,j,k,from,to;    while(scanf("%d",&n)!=EOF)    {        if(n==0)    break;        for(i=1;i<=n;i++)            for(j=1;j<=n;j++)            {                scanf("%d",&a[i][j]);                c[i][j]=j;            }        for(i=1;i<=n;i++)            scanf("%d",&b[i]);        for(k=1;k<=n;k++)        {            for(i=1;i<=n;i++)            {                if(i==k||a[k][i]==-1)   continue;                for(j=1;j<=n;j++)                {                    if(a[k][j]==-1||i==j||k==j) continue;                    if(a[i][j]==-1||a[i][k]+a[k][j]+b[k]<a[i][j])                    {                        a[i][j]=a[i][k]+a[k][j]+b[k];                        c[i][j]=c[i][k];                    }                    if(a[i][k]+a[k][j]+b[k]==a[i][j]&&c[i][k]<c[i][j])                        c[i][j]=c[i][k];                }            }        }        while(1)        {            scanf("%d%d",&from,&to);            if(from==-1&&to==-1)    break;            printf("From %d to %d :\n",from,to);            if(from==to)    printf("Path: %d\n",from);            else            {                printf("Path: %d",from);                find(from,to);            }            printf("Total cost : %d\n\n",a[from][to]);        }    }    return 0;}


原创粉丝点击