您的位置:首页 > 其它

hdu 1690 Bus System Floyd 求最短路径

2014-03-11 22:29 239 查看
题目地址: 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;
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: