HDU 1385

吐个槽,第一遍的时候竟然是输出受限制,但结果却是对的,后来删了重新敲了一遍,竟然AC了!坑啊!
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=505;
int mp[maxn][maxn];
int pre[maxn][maxn];
int cost[maxn];
int n;




void init()
{
    int i,j;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            if(i==j)
                mp[i][j]=0;
            else
                mp[i][j]=inf;
        }
    }
}


void input()
{
    int i,j;
    int x;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            scanf("%d",&x);
            if(x!=-1)
                mp[i][j]=x;
            pre[i][j]=j;
        }
    }


    for(i=1; i<=n; i++)
    {
        scanf("%d",&cost[i]);
    }
}


void floyd()
{
    int k,i,j;
   for(k=1; k<=n; k++)
   {
       for(i=1; i<=n; i++)
       {
           for(j=1; j<=n; j++)
           {
               if(mp[i][j]>mp[i][k]+mp[k][j]+cost[k])
               {
                   mp[i][j]=mp[i][k]+mp[k][j]+cost[k];
                   pre[i][j]=pre[i][k];
               }
               else if(mp[i][j]==(mp[i][k]+mp[k][j]+cost[k]))
               {
                   if(pre[i][j]>pre[i][k])
                   {
                       pre[i][j]=pre[i][k];
                   }
               }
           }
       }
   }
}


void ff()
{
    int a,b,i;
    while(scanf("%d%d",&a,&b))
    {
        if(a==-1&&b==-1)
            break;
        printf("From %d to %d :\n",a,b);
        printf("Path: %d",a);
        i=a;
        while(i!=b)
        {
            printf("-->%d",pre[i][b]);
            i=pre[i][b];
        }
        printf("\n");
        printf("Total cost : %d\n",mp[a][b]);
        printf("\n");
    }
}


int main()
{
    while(scanf("%d",&n),n)
    {
        init();
        input();
        floyd();
        ff();
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值