1690Bus System

题目大意:

在笔直的道路上有很多的站点,每个站点都用横坐标表示,任意两个站点之间的票钱与两个站点的距离之间存在对应该的关系。现在给你把这些站点在横坐标上的位置给你,随机的问你两个站点之间是否存在最少的花费方案,并输出!

解题思路:

首先是自己构图,然后flyod,因为要求任意两点之间的距离,而且V<=100!然后忘了告诉你数据很坑,就都用int64处理吧!

哎这题有粗心了,说多了都是泪啊!

#include<stdio.h>
#define N 110
const __int64 inf= 1e18;
__int64 int L[6],C[6],x[N];
__int64 mp[N][N];
__int64 getvalue(int dis){
     if(0<dis&&dis<=L[1])
        return (__int64 )C[1];
  if(dis>L[1]&&dis<=L[2])
        return (__int64 )C[2];
 if(dis>L[2]&&dis<=L[3])
        return (__int64 )C[3];   else if(dis>L[3]&&dis<=L[4])
        return (__int64 )C[4];
    else if(dis>L[4])
        return (__int64 )inf;
    else if(dis==0)
        return 0;
}
void floyd(int n){
    int i,j,k;
    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]){
                    mp[i][j]=mp[i][k]+mp[k][j];
                }
        }
}
int main()
{
    int t,i,n,m,j,dis,cas=0;
    scanf("%d",&t);
    while(t--){
            ++cas;
        for(i=1;i<=4;i++)
           scanf("%d",&L[i]);
        for(i=1;i<=4;i++)
            scanf("%d",&C[i]);
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++)
            scanf("%d",&x[i]);
        for(i=1;i<=n;i++)
           for(j=1;j<=n;j++){
                dis=(x[i]-x[j])>=0?(x[i]-x[j]):(x[j]-x[i]);
                mp[i][j]=mp[j][i]=getvalue(dis);
         }
         floyd(n);
           printf("Case %d:\n",cas);
         for(i=1;i<=m;i++){
                scanf("%d%d",&n,&j);

                if(mp[n][j]!=inf)
                    printf("The minimum cost between station %d and station %d is %d.\n",n,j,mp[n][j]);
                else
                    printf("Station %d and station %d are not attainable.\n",n,j);
         }

    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值