HDU 1690 Bus System(Floyd)
http://acm.hdu.edu.cn/showproblem.php?pid=1690
题意:
本质是给你一个无向图,要你求指定两点间的最短距离.
分析:
直接Floyd算法即可,不过要注意单个距离最大为10亿,如果用int肯定不行,需要用long long 且d[i][j]初值INF要足够大或者干脆用-1表示才行.
AC代码: 注意细节
#include<cstdio>
#include<cmath>
using namespace std;
#define INF 0x7fffffffffffffff
const int maxn = 100+10;
int n,m;
long long d[maxn][maxn];
void init()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
d[i][j] = i==j?0:INF; //这里如果用-1表示不可达的话,后面d[i][j]还需要看它是不是-1
}
void floyd()
{
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(d[i][k]<INF && d[k][j]<INF && d[i][j]>d[i][k]+d[k][j])
d[i][j] = d[i][k]+d[k][j];
}
int main()
{
int T;
scanf("%d",&T);
for(int kase=1;kase<=T;kase++)
{
long long L[4],C[4];
scanf("%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d",&L[0],&L[1],&L[2],&L[3],&C[0],&C[1],&C[2],&C[3]);
scanf("%d%d",&n,&m);
init(); //初始化
int x[maxn];
for(int i=0;i<n;i++)
scanf("%d",&x[i]);
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
if(abs(x[i]-x[j])<=L[0])
d[i][j]=d[j][i]=C[0];
else if(abs(x[i]-x[j])<=L[1])
d[i][j]=d[j][i]=C[1];
else if(abs(x[i]-x[j])<=L[2])
d[i][j]=d[j][i]=C[2];
else if(abs(x[i]-x[j])<=L[3])
d[i][j]=d[j][i]=C[3];
else
d[i][j]=d[j][i]=INF;
}
floyd(); //不要忘了这个
printf("Case %d:\n",kase);
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
u--,v--;
if(d[u][v]!=INF)
printf("The minimum cost between station %d and station %d is %I64d.\n",u+1,v+1,d[u][v]);
else
printf("Station %d and station %d are not attainable.\n",u+1,v+1);
}
}
return 0;
}