题意:车站都在一条直线上用X坐标轴表示,车站用相应的坐标点表示,因距离不同,则车费也不同,给出相应距离的收费情况,给出出发点和终点站,若 最少花费存在则输出,
分析:各点之间的距离 即 Floyd算法 map[i][j]表示 i点到j点的距离,有松弛 不断更新
#include<string.h>
#define inf 99999999999LL//太小会WA!!!
__int64 map[110][110],cor[110];
__int64 l1,l2,l3,l4,c1,c2,c3,c4;//int64 不是long long
__int64 n;
__int64 fabs(__int64 a)
{
if(a<0)
a=-a;
return a;
}
void floyd()//Floyd算法 更新两点之间的距离
{
int k,i ,j;
for(k=1; k<=n; k++)//K点要在外层循环中
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
if(map[i][k]!=inf&&map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
}
__int64 chang(__int64 x)
{
if(x<=l1&&x>0)
return c1;
if(x<=l2&&x>l1)
return c2;
if(x<=l3&&x>l2)
return c3;
if(x<=l4&&x>l3)
return c4;
return inf;
}
int main()
{
__int64 t,m,i,j,pp,x,y;
pp=0;
scanf("%I64d",&t);
while(t--)
{
pp++;
scanf("%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d",&l1,&l2,&l3,&l4,&c1,&c2,&c3,&c4);
scanf("%I64d%I64d",&n,&m);
for(i=1; i<=n; i++)
scanf("%I64d",&cor[i]);
for(i=0; i<=n; i++)//map数组初始化
for(j=0; j<=n; j++)
{
if(i==j)
map[i][j]=0;
else
map[i][j]=map[j][i]=inf;
}
for(i=1; i<=n; i++)
for(j=i+1; j<=n; j++)
map[i][j]=map[j][i]=chang(fabs(cor[j]-cor[i]));//map存两点之间的花费,map数组和cor数组中的i,j需要相对应
floyd();
printf("Case %I64d:\n",pp);
for(i=0; i<m; i++)
{
scanf("%I64d%I64d",&x,&y);
if(map[x][y]!=inf)
printf("The minimum cost between station %I64d and station %I64d is %I64d.\n",x,y,map[x][y]);
else
printf("Station %I64d and station %I64d are not attainable.\n",x,y);
}
}
return 0;
}