一、题目编号:
1013
二、简单题意:
由于中国巨大的人口数量,公共交通非常重要。公交车在传统交通体系中是非常重要的,即使在现代也扮演着重要的角色。城市X的公交车系统非常奇怪,车票的价格决定于两个站点之间的距离。给出了描述距离和价钱之间关系的表格。你的邻居是一个路痴,他给出两个站点,要求帮他算出最少的花费。
三、解题思路形成过程
Floyd算法算就可以了。
四、感想
这个题不难,直接套用算法模板就可以了。
五、AC代码
#include
#include
#include
#define INF 1e18
#define MAXN 117
long long dis[MAXN][MAXN],L1,L2,L3,L4,C1,C2,C3,C4,f[MAXN];
int n, m;
long long min(long long a,long long b)
{
return a < b ? a:b;
}
void init()
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
dis[i][j] = INF;
}
}
}
void Floyd()
{
for(int k = 1; k <= n; k++)
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
}
long long cal(long long x)
{
if(x > 0 && x <= L1)
return C1;
if(x > L1 && x <= L2)
return C2;
if(x > L2 && x <= L3)
return C3;
if(x > L3 && x <= L4)
return C4;
return INF;
}
int main()
{
int t;
int i, j;
long long s, e;
int cas = 0;
scanf("%d",&t);
while(t--)
{
scanf("%I64d%I64d%I64d%I64d",&L1,&L2,&L3,&L4);
scanf("%I64d%I64d%I64d%I64d",&C1,&C2,&C3,&C4);
scanf("%d%d",&n,&m);
init();
memset(f,0,sizeof(f));
for(i = 1; i <= n; i++)
{
scanf("%I64d",&f[i]);
}
for(i = 1; i < n; i++)
{
for(j = i+1; j <= n; j++)
{
dis[i][j] = dis[j][i] = cal(fabs(f[i]-f[j]));
}
}
Floyd();
printf("Case %d:\n",++cas);
for(i = 1; i <= m; i++)
{
scanf("%I64d%I64d",&s,&e);
if(dis[s][e] != INF)
printf("The minimum cost between station %I64d and station %I64d is %I64d.\n",s,e,dis[s][e]);
else
printf("Station %I64d and station %I64d are not attainable.\n",s,e);
}
}
return 0;
}