1182: 公交车站
使用floyd,如果使用dijkstra即使用优先队列,M次使用dijkstra也会超时的
#include <bits/stdc++.h>
using namespace std;
const int N=505;
int dist[N][N];
int t;
int INF=1e9;
int station[N];
int main(){
scanf("%d",&t);
for(int h=1;h<=t;h++){
int l1,l2,l3,l4,c1,c2,c3,c4;
scanf("%d%d%d%d%d%d%d%d",&l1,&l2,&l3,&l4,&c1,&c2,&c3,&c4);
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&station[i]);
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
if(i==j){
dist[i][j]=0;
dist[j][i]=0;
}
else if(abs(station[i]-station[j])<=l1){
dist[i][j]=c1;
dist[j][i]=c1;
}
else if(abs(station[i]-station[j])<=l2){
dist[i][j]=c2;
dist[j][i]=c2;
}
else if(abs(station[i]-station[j])<=l3){
dist[i][j]=c3;
dist[j][i]=c3;
}
else if(abs(station[i]-station[j])<=l4){
dist[i][j]=c4;
dist[j][i]=c4;
}
else {
dist[i][j]=INF;
dist[j][i]=INF;
}
}
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dist[i][j]>dist[i][k]+dist[k][j])
dist[i][j]=dist[i][k]+dist[k][j];
}
}
}
printf("Case %d:\n",h);
for(int i=1;i<=m;i++){
int s,t;
scanf("%d%d",&s,&t);
if(dist[s][t]>=INF){
printf("Station %d and station %d are not attainable.\n",s,t);
}
else{
printf("The minimum cost between station %d and station %d is %d.\n",s,t,dist[s][t]);
}
}
}
}

浙公网安备 33010602011771号