连接https://atcoder.jp/contests/abc143/tasks/abc143_e
题目大意:
在一个无向图中,当前的油量为L,给出q个问题,判断从a到b需要多少加几次油,路上每个节点都可以加油,输出需要加油的最少次数
AC代码:
#include<bits/stdc++.h> using namespace std; const int N=500; typedef long long ll; const ll inf=1e15+7; ll arr[N][N]; ll brr[N][N]; int main(){ ll n,m,l; cin>>n>>m>>l; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ if(i!=j) arr[i][j]=brr[i][j]=inf; } ll x,y,z; for(int i=1;i<=m;i++){ scanf("%lld%lld%lld",&x,&y,&z); arr[x][y]=z; arr[y][x]=z; } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) arr[i][j]=min(arr[i][j],arr[i][k]+arr[k][j]); } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ if(arr[i][j]<=l&&i!=j) brr[i][j]=1; } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) brr[i][j]=min(brr[i][j],brr[i][k]+brr[k][j]); } int q; cin>>q; while(q--){ int a,b; cin>>a>>b; if(brr[a][b]>=inf) cout<<-1<<endl; else cout<<brr[a][b]-1<<endl; } return 0; }