題目大意:給出若干巴士不一樣價格的票的乘坐距離範圍,如今有N個站點,有M次詢問,查詢任意兩個站點的最小花費ios
解析:因爲是屢次查詢不一樣站點的最小花費,因此用弗洛伊德求解 時間複雜度(O^3) 比較基礎的弗洛伊德ide
#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:\n",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.\n",st,ed,dis[st][ed]); else printf("Station %d and station %d are not attainable.\n",st,ed); } } return 0; }