题目地址: hdu1690
给你一些车站,问这些车站之间的最“短”(费用最少)路径。
结点个数100 直接用floyd
比较坑的是,给的坐标并没有按升序 还要用abs wa了很多次
#include<iostream>
#include<cmath>
using namespace std;
#define INF 1000000000000000000LL
typedef long long inta;
int l1,l2,l3,l4,c1,c2,c3,c4;
int n,m;
inta d[105][105];
inta px[105];
void init()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
d[i][j]=INF;
for(int i=0;i<n;i++)
d[i][i]=0;
}
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][j]<d[i][k]+d[k][j]?d[i][j]:d[i][k]+d[k][j];
}
inta calc(inta dist)
{
if(dist<=l1) return c1;
else if(dist<=l2) return c2;
else if(dist<=l3) return c3;
else if(dist<=l4) return c4;
else return INF;
}
int main()
{
int cas;
cin>>cas;
int from,to;
for(int l=0;l<cas;l++)
{
cin>>l1>>l2>>l3>>l4>>c1>>c2>>c3>>c4>>n>>m;
for(int i=0;i<n;i++)
cin>>px[i];
init(); // 初始化
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
d[i][j]=d[i][j]<calc(abs(px[j]-px[i]))?d[i][j]:calc(abs(px[j]-px[i]));
d[j][i]=d[i][j];
}
floyd();
cout<<"Case "<<l+1<<":"<<endl;
for(int i=0;i<m;i++)
{
cin>>from>>to;
if(d[from-1][to-1]!=INF)
cout<<"The minimum cost between station "<<from<<" and station "<<to<<" is "<<d[from-1][to-1]<<"."<<endl;
else
cout<<"Station "<<from<<" and station "<<to<<" are not attainable."<<endl;
}
}
}