hdu 1690 Bus System Floyd 求最短路径
题目地址: 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; } } }
posted on 2014-03-11 22:29 814jingqi的ACM 阅读(133) 评论(0) 编辑 收藏 举报