Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.17 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cstring>
  3. #include <ctime>
  4. #include <iostream>
  5. #include <map>
  6. #include <set>
  7. #include <stack>
  8. #include <string>
  9. #include <unordered_map>
  10. #include <unordered_set>
  11. #include <vector>
  12. using namespace std;
  13.  
  14. #ifdef __APPLE__
  15. #define eprintf(...) fprintf(stderr, __VA_ARGS__)
  16. #else
  17. #define eprintf(...)
  18. #endif
  19.  
  20. const int N = (int)1e5 + 123;
  21. const int MOD = (int)1e9 + 7;
  22. const int inf = (int)5e8;
  23. const long long infll = (long long)2e18;
  24.  
  25.  
  26. struct Edge {
  27.     int u;
  28.     int v;
  29.     long long t;
  30.     int id;
  31.     Edge() = default;
  32.     Edge(int u, int v, long long t, int id) : u(u), v(v), t(t), id(id) {}
  33. };
  34.  
  35. vector<pair<long long, long long>> block[N];
  36. vector<int> g[N];
  37. Edge edges[N];
  38. long long h2 = 100500;
  39. long long h1 = 100;
  40. long long h3 = 1;
  41.  
  42. long long my_ceil(long long tnow, long long f1, long long t) {
  43.     if (h1 + tnow - f1 > h2 * h1) return h2 * t;
  44.     if (((tnow - f1) * t) % h1 == 0) return t + ((tnow - f1) * t) / h1;
  45.     else return t + ((tnow - f1) * t) / h1 + h3;
  46. }
  47.  
  48. void solve() {
  49.     int n, m;
  50.     scanf("%d %d", &n, &m);
  51.     for (int i = 0; i < m; ++i) {
  52.         int u, v, t;
  53.         scanf("%d %d %d", &u, &v, &t);
  54.         --u;
  55.         --v;
  56.         edges[i] = Edge(u, v, t, i);
  57.         g[u].push_back(i);
  58.         g[v].push_back(i);
  59.     }
  60.     int k;
  61.     scanf("%d", &k);
  62.     for (int i = 0; i < k; ++i) {
  63.         int id;
  64.         long long s, f;
  65.         scanf("%d %lld %lld", &id, &s, &f);
  66.         --id;
  67.         block[id].push_back({s, f});
  68.     }
  69.     for (int i = 0; i < m; ++i) {
  70.         block[i].push_back({-1, 0});
  71.         block[i].push_back({infll, infll + 1});
  72.         sort(block[i].begin(), block[i].end());
  73.     }
  74.     set<pair<long long, int>> que = {{0LL, 0}};
  75.     vector<long long> dist(n, infll);
  76.     dist[0] = 0;
  77.     while (que.size() > 0) {
  78.         int u = que.begin()->second;
  79.         que.erase(que.begin());
  80.         for (auto to : g[u]) {
  81.             long long time = dist[u];
  82.             auto edge = edges[to];
  83.             int v = edge.v;
  84.             if (u == v) {
  85.                 v = edge.u;
  86.             }
  87.             auto it = upper_bound(block[edge.id].begin(), block[edge.id].end(),
  88.                                   make_pair(time, 0LL));
  89.             auto prev = it - 1;
  90.             while (it != block[edge.id].end()) {
  91.                 long long edge_len = my_ceil(time, prev->second, edge.t);
  92.                 long long begin = it->first;
  93.                 long long end = it->second;
  94.                 if (time + edge_len <= begin) {
  95.                     if (dist[v] > time + edge_len) {
  96.                         que.erase({dist[v], v});
  97.                         dist[v] = time + edge_len;
  98.                         que.insert({dist[v], v});
  99.                     }
  100.                     break;
  101.                 }
  102.                 time = end;
  103.                 ++it;
  104.                 ++prev;
  105.             }
  106.         }
  107.     }
  108.     if (dist[n - 1] >= infll) throw;
  109.     printf("%lld\n", dist[n - 1]);
  110. }
  111.  
  112. int main() {
  113. #ifdef __APPLE__
  114.     freopen("input.txt", "r", stdin);
  115.     freopen("output.txt", "w", stdout);
  116. #endif
  117.     int t = 1;
  118.     while (t--) {
  119.         solve();
  120.     }
  121.     return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement