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]);
			}
		}
	}
}
posted @ 2026-03-10 17:17  peter_shen  阅读(10)  评论(0)    收藏  举报