http://acm.hdu.edu.cn/showproblem.php?pid=1690
这题的坑处主要在于 INF 的赋值 和 FLOYD 中有个条件的判断
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
__int64 L[10],C[10];
__int64 coor[105];
__int64 map[105][105];
const /*unsigned*/ __int64 INF = 99999999999999999LL;
int main()
{
int T,t=1;
int i,j,k;
scanf("%d",&T);
while(T--)
{
for(i=0;i<4;i++) scanf("%I64d",&L[i]);
for(i=0;i<4;i++) scanf("%I64d",&C[i]);
int n,m;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j)
map[i][j]=0;
else
map[i][j]=INF;
}
}
for(i=1;i<=n;i++)
{
scanf("%I64d",&coor[i]);
for(j=i-1;j>=1;j--)
{
__int64 temp=coor[i]-coor[j];
if(temp<0)
temp=-temp;
if(temp<=L[0]) {map[i][j]=map[j][i]=C[0];}
else if(temp<=L[1]) {map[i][j]=map[j][i]=C[1];}
else if(temp<=L[2]) {map[i][j]=map[j][i]=C[2];}
else if(temp<=L[3]) {map[i][j]=map[j][i]=C[3];}
else continue;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
for(k=1;k<=n;k++)
{
if(j==k)
continue;
if(map[i][k]==INF||map[i][j]==INF) //如果无穷大的边在下面做加法 会因为超过__int64 而和的结果会变负值
continue;
if(map[j][k]>(map[j][i]+map[i][k]))
map[j][k]=map[k][j]=map[j][i]+map[i][k];
}
}
}
int a,b;
printf("Case %d:\n",t++);
while(m--)
{
scanf("%d%d",&a,&b);
if(map[a][b]==INF)
printf("Station %d and station %d are not attainable.\n",a,b);
else
printf("The minimum cost between station %d and station %d is %I64d.\n",a,b,map[a][b]);
}
}
return 0;
}