题目大意:给出若干巴士不同价格的票的乘坐距离范围,现在有N个站点,有M次询问,查询任意两个站点的最小花费
解析:由于是多次查询不同站点的最小花费,所以用弗洛伊德求解 时间复杂度(O^3) 比较基础的弗洛伊德
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define INF 1000000000000 typedef __int64 LL; const int N = 110; __int64 dis[N][N],place[N]; __int64 L1,L2,L3,L4,C1,C2,C3,C4; int n,m; LL judge(LL x) { if(x < 0) x *= -1; if(x > 0 && x <= L1) return C1; else if(x > L1 && x <= L2) return C2; else if(x > L2 && x <= L3) return C3; else if(x > L3 && x <= L4) return C4; else return INF; } void floyd() { for(int k=1; k<=n; k++) { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(dis[i][j] > dis[i][k] + dis[k][j] && dis[i][k] != INF && dis[k][j] != INF) dis[i][j] = dis[i][k] + dis[k][j]; } } } } int main() { //freopen("input.txt","r",stdin); int t; int kase = 1; cin>>t; while(t--) { scanf("%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d",&L1,&L2,&L3,&L4,&C1,&C2,&C3,&C4); scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) { scanf("%I64d",&place[i]); } for(int i=1; i<=n; i++) { for(int j=i+1; j<=n; j++) { __int64 x = place[i] - place[j]; dis[i][j] = dis[j][i] = judge(x); } } floyd(); printf("Case %d: ",kase++); for(int i=1; i<=m; i++) { int st,ed; scanf("%d%d",&st,&ed); if(dis[st][ed] != INF) printf("The minimum cost between station %d and station %d is %I64d. ",st,ed,dis[st][ed]); else printf("Station %d and station %d are not attainable. ",st,ed); } } return 0; }