題意:先給出了一個表格,這個表格也表示路程和花費的模板,然後根據這個對下面的問題進行解決,然後第三行給的是n,m,緊接着就是n行,表示的是0到1的距離,0到2的距離,0到3的距離。。。。依次下去。接下來的m行表示的就是要求的起點和終點了。
思路:直接用Dijkastra就ok了 稍稍做一點點的變形,要注意的本題數據比較大 在定義最大值常量的時候要注意 一開始還WA了好多遍 結果定義成const __int64 inf=0xffffffffffffff;就過了,輸入輸出也要用__int64 。
感想:變態,還要變形~
代碼:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const __int64 inf = 1e18;
__int64 map[105][105];
__int64 k[105];
__int64 a[5];
__int64 c[5];
__int64 n,m;
__int64 judge(__int64 x)
{
if(x>0 && x<=a[1])
return c[1];
if(x<=a[2])
return c[2];
if(x<=a[3])
return c[3];
if(x<=a[4])
return c[4];
return inf;
}
__int64 kabs(__int64 a)
{
return a<0?-a:a;
}
void floyd()
{
__int64 i,j,k;
for(k = 1; k<=n; k++)
for(i = 1; i<=n; i++)
for(j = 1; j<=n; j++)
if(map[i][j]>map[i][k]+map[k][j])
map[i][j] = map[i][k]+map[k][j];
}
int main()
{
__int64 t,i,j,x,y,cas = 1;
scanf("%I64d",&t);
while(t--)
{
for(i = 1; i<=4; i++)
scanf("%I64d",&a[i]);
for(i = 1; i<=4; i++)
scanf("%I64d",&c[i]);
scanf("%I64d%I64d",&n,&m);
for(i = 1; i<=n; i++)
scanf("%I64d",&k[i]);
for(i = 0; i<=n; i++)
{
for(j = 0; j<=n; j++)
map[i][j] = inf;
map[i][i] = 0;
}
for(i = 1; i<=n; i++)
for(j = i; j<=n; j++)
{
map[i][j] = map[j][i] = judge(kabs(k[j]-k[i]));
}
floyd();
printf("Case %I64d:\n",cas++);
while(m--)
{
scanf("%I64d%I64d",&x,&y);
if(map[x][y] == inf)
printf("Station %I64d and station %I64d are not attainable.\n",x,y);
else
printf("The minimum cost between station %I64d and station %I64d is %I64d.\n",x,y,map[x][y]);
}
}
return 0;
}