HDU 1690 floyd

#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;
}

你可能感兴趣的:(HDU 1690 floyd)