https://vjudge.net/contest/382787#problem/J
参考博客
注意:在floyd中,e[i][i]必须是0,不能为其他数 ,否则会出错
#include<bits/stdc++.h>
#define ll long long
#define MAXN 310
#define INF 0X3f3f3f3f
const ll inf=1e18;
using namespace std;
int n,m;
ll l;
ll e[MAXN][MAXN];
int ans[MAXN][MAXN];
int main(){
scanf("%d%d%lld",&n,&m,&l);
int a,b;
ll c;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j)continue;//注意:在floyd中,e[i][i]必须是0,不能为其他数否则会出错
e[i][j]=inf;
ans[i][j]=INF;
}
}
for(int i=1;i<=m;i++){
scanf("%d%d%lld",&a,&b,&c);
e[a][b]=c;
e[b][a]=c;
}
for(int k=1;k<=n;k++){//第一次floyd
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j)continue;
if(e[i][j]<=l)ans[i][j]=1;
}
}
for(int k=1;k<=n;k++){//第二次floyd
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
ans[i][j]=min(ans[i][j],ans[i][k]+ans[k][j]);
}
}
}
int q;
scanf("%d",&q);
while(q--){
scanf("%d%d",&a,&b);
if(ans[a][b]>=INF){
printf("-1\n");
continue;
}
printf("%d\n",ans[a][b]-1);
}
}