E

连接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;
}
原文地址:https://www.cnblogs.com/Accepting/p/11716229.html