Submission #624983

#TimeUsernameProblemLanguageResultExecution timeMemory
624983MilosMilutinovicCeste (COCI17_ceste)C++14
160 / 160
956 ms24396 KiB
/**
 *    author:  wxhtzdy
 *    created: 09.08.2022 10:15:44
**/
#include <bits/stdc++.h>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);  
  int n, m;
  cin >> n >> m;
  vector<vector<array<int, 3>>> g(n);
  for (int i = 0; i < m; i++) {
    int x, y, t, c;
    cin >> x >> y >> t >> c;
    --x; --y;
    g[x].push_back({y, t, c});
    g[y].push_back({x, t, c}); 
  }
  vector<set<pair<int, int>>> dist(n);
  dist[0].insert({0, 0});
  set<array<int, 3>> st;
  st.insert({0, 0, 0}); 
  auto Update = [&](int v, int t, int c) {
    auto it = dist[v].lower_bound({t, c});    
    while (it != dist[v].end()) {
      if (it->first >= t && it->second >= c) {
        if (st.find({v, it->first, it->second}) != st.end()) {
          st.erase(st.find({v, it->first, it->second}));
        }
        it = dist[v].erase(it);
      } else {
        break;
      }
    }
    it = dist[v].lower_bound({t, c});             
    if (it != dist[v].begin()) {
      it = prev(it);           
      if (it->first < t && it->second > c) {
        dist[v].emplace(t, c);
        st.insert({t, c, v});
      }
    } else {
      dist[v].emplace(t, c);
      st.insert({t, c, v});
    }
  };
  while (!st.empty()) {
    auto it = st.begin();
    int t = (*it)[0];
    int c = (*it)[1]; 
    int u = (*it)[2];
    st.erase(it);
    for (auto& p : g[u]) {
      Update(p[0], t + p[1], c + p[2]);
    }
  }
  for (int i = 1; i < n; i++) {
    if (dist[i].empty()) {
      cout << -1 << '\n';
    } else {
      long long ans = 1e18;
      for (auto& p : dist[i]) {
        ans = min(ans, p.first * 1LL * p.second);
      }
      cout << ans << '\n';
    }
  }                         
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...