Advertisement
Guest User

Atcoder ABC 143 Problem E

a guest
Dec 1st, 2022
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.50 KB | None | 0 0
  1. #include<iostream>
  2. #include<bits/stdc++.h>
  3. #include<algorithm>
  4. using namespace std;
  5.  
  6. #define fastio() ios_base::sync_with_stdio(false);cin.tie(NULL);
  7. #define fileio() freopen("input.txt","r",stdin); freopen("output2.txt","w",stdout);
  8. #define ll long long int
  9. #define pb push_back
  10. #define ppb pop_back
  11. #define pf push_front
  12. #define ppf pop_front
  13. #define forn(l,n,i) for(ll i=l;i<n;i++)
  14. #define mp make_pair
  15. #define F first
  16. #define S second
  17.  
  18. ll inf=1e18;
  19. void get_path(int s,int e,vector<vector<int>>& path,vector<int>& p){
  20.     p.pb(s);
  21.     while(s!=e){
  22.         s=path[s][e];
  23.         p.pb(s);
  24.     }
  25. }
  26.  
  27. vector<int> travelByCar(ll n,ll l, vector<vector<int>>edges ,vector<vector<int>> queries)
  28. {
  29.     vector<vector<ll>> dist(n+1,vector<ll>(n+1,inf));
  30.     vector<vector<int>> path(n+1,vector<int>(n+1,-1));
  31.     forn(1,n+1,i) {
  32.         dist[i][i]=0;
  33.     }
  34.     for(auto x:edges){
  35.         dist[x[0]][x[1]]=x[2];
  36.         dist[x[1]][x[0]]=x[2];
  37.         path[x[0]][x[1]]=x[1];
  38.         path[x[1]][x[0]]=x[0];
  39.     }
  40.     forn(1,n+1,k){
  41.         forn(1,n+1,i){
  42.             forn(1,n+1,j){
  43.                 if(dist[i][k]!=inf && dist[k][j]!=inf && dist[i][j]>dist[i][k]+dist[k][j]){
  44.                     dist[i][j]=dist[i][k]+dist[k][j];
  45.                     path[i][j]=path[i][k];
  46.                 }
  47.             }
  48.         }
  49.     }
  50.     vector<int> res(queries.size(),0);
  51.     forn(0,queries.size(),i){
  52.         int a=queries[i][0];
  53.         int b=queries[i][1];
  54.         if(dist[a][b]!=inf){
  55.             vector<int> p;
  56.             get_path(a,b,path,p);
  57.             int ans=0;
  58.             int cur=l;
  59.             forn(0,p.size()-1,j){
  60.                 ll val=dist[p[j]][p[j+1]];
  61.                 if(val>l){
  62.                     res[i]=-1;
  63.                     break;
  64.                 }
  65.                 else if(val>cur){
  66.                     cur=l-val;
  67.                     ans++;
  68.                 }
  69.                 else cur-=val;
  70.             }
  71.             res[i]=ans;
  72.         }
  73.         else res[i]=-1;
  74.     }
  75.     return res;
  76. }
  77.  
  78. void solve(){
  79.     ll n,m,l;
  80.     cin>>n>>m>>l;
  81.     vector<vector<int>> v(m,vector<int>(3));
  82.     forn(0,m,i) cin>>v[i][0]>>v[i][1]>>v[i][2];
  83.     int q;
  84.     cin>>q;
  85.     vector<vector<int>> que(q,vector<int>(2));
  86.     forn(0,q,i) cin>>que[i][0]>>que[i][1];
  87.     for(int x:travelByCar(n,l,v,que)) cout<<x<<endl;
  88. }
  89.  
  90. int main(){
  91.  
  92.     //fastio();
  93.     // fileio();
  94.     ll t;
  95.     // cin>>t;
  96.     t=1;
  97.     while(t--){
  98.         solve();
  99.         // cout<<'\n';
  100.     }
  101.     return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement