题目大意:
在笔直的道路上有很多的站点,每个站点都用横坐标表示,任意两个站点之间的票钱与两个站点的距离之间存在对应该的关系。现在给你把这些站点在横坐标上的位置给你,随机的问你两个站点之间是否存在最少的花费方案,并输出!
解题思路:
首先是自己构图,然后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;
}