站外题求助
  • 板块灌水区
  • 楼主fqzcwei
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/10/7 19:55
  • 上次更新2024/10/7 22:53:11
查看原帖
站外题求助
1016445
fqzcwei楼主2024/10/7 19:55

题目描述
给定 N 点 M 边的无向图,第 i 条边的两个端点为 A[i] 和B[i],距离为 C[i]。
一辆汽车的油箱储量为 L 升,每升油正好走一单位路径的距离。车行驶到每个点都可以选择不加油,或是直接加油至满载 L 升。若当前油量小于某条边的距离C[i],则不允许往这条边走(会抛锚)。
Q 次询问,每次询问从点 s[i] 开车到点 t[i] 最少需要加几次油。车的初始油箱是满的。

输入格式

N M L
A[1] B[1] C[1]
.
.
A[M] B[M] C[M]
Q
s[1] t[1]
.
.
s[Q] t[Q]

输出格式 Q行,每行一个整数表示最少加油次数,无解输出-1。

样例输入

3 2 5
1 2 3
2 3 3
2
3 2
1 3

样例输出

0
1

代码只有40分,求助

#include<bits/stdc++.h>

using namespace std;
int n,m,l;
int dis[400][400],fuel[400][400];
void floyd(){
	for(int k=1;k<=n;k++){
			dis[k][k]=0;
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);	
				}
			}
		}
}
void floyd2(){
	for(int k=1;k<=n;k++){
			fuel[k][k]=1;
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					fuel[i][j]=min(fuel[i][j],fuel[i][k]+fuel[k][j]);	
				}
			}
		}
}
int main(){
	cin>>n>>m>>l;
	memset(dis,0x3f3f3f,sizeof(dis));
	for(int i=1;i<=m;i++){
		int a,b,c;
		cin>>a>>b>>c;
		if(dis[a][b]>c) dis[a][b]=c,dis[b][a]=c;
	}
	floyd();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(dis[i][j]<=l)fuel[i][j]=1;
			else dis[i][j]=0x3f3f3f;
		}
	}
	floyd2();
	int q;
	cin>>q;
	while(q--){
		int s,t;
		cin>>s>>t;
		cout<<fuel[s][t]-1<<endl;
	}
}
2024/10/7 19:55
加载中...