HDU 1690 floyd

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-21 12:20   35   0
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const long long INF = 1e18;
const int VN  = 105;

int n;
int m;
long long d[VN][VN];

long long X[VN];
long long L1,L2,L3,L4;
long long C1,C2,C3,C4;

inline long long abs(long long x){return x<0?-x:x;}
void init(){
 for(int i=1; i<=n; ++i){
  d[i][i] = 0;
  for(int j=i+1; j<=n; ++j)
   d[i][j]=d[j][i]=INF;
 }
}

long long getCost(long long dist){
 if(0<dist && dist<=L1) return C1;
 if(L1<dist && dist<=L2) return C2;
 if(L2<dist && dist<=L3) return C3;
 if(L3<dist && dist<=L4) return C4;
 return INF;
}

void Floyd(){
 for(int k=1; k<=n; ++k)
  for(int i=1; i<=n; ++i)if(d[i][k]!=INF)
   for(int j=1; j<=n; ++j)if(d[k][j]!=INF)
    d[i][j]=min(d[i][j], d[i][k]+d[k][j]);
}

int main(){
 int T,cas=1;
 scanf("%d",&T);
 while(T--){
  cin >> L1 >> L2 >> L3 >> L4;
  cin >> C1 >> C2 >> C3 >> C4;
  scanf("%d%d",&n,&m);
  for(int i=1; i<=n; ++i)
   cin >> X[i];
  init();
  for(int i=1; i<=n; ++i){
   for(int j=i+1; j<=n; ++j){
    d[i][j]=d[j][i]=getCost(abs(X[i]-X[j]));
   }
  }
  Floyd();
  int u,v;

  printf("Case %d:\n",cas++);
  for(int i=0; i<m; ++i){
   scanf("%d%d",&u,&v);
   if(d[u][v]!=INF){
    printf("The minimum cost between station %d and station %d is ",u,v);
    cout << d[u][v] << ".\n";
   }
   else 
    printf("Station %d and station %d are not attainable.\n",u,v);
  }
 }
 return 0;
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP