题目描述
给定 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;
}
}