tien_noob

MEETINGPOINT - ĐT

Jul 4th, 2021 (edited)
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.53 KB | None | 0 0
  1. //Make CSP great again
  2. #include <bits/stdc++.h>
  3. #define TASK "TESTCODE"
  4. using namespace std;
  5. const int N = 1e5;
  6. long long d1[N + 1], d2[N + 1], l[N + 1], r[N + 1];
  7. int n, m, k, id[N + 1];
  8. struct TEdge
  9. {
  10.     int u, v, w;
  11. };
  12. TEdge e[2*N + 1];
  13. vector<int> Adj[N + 1];
  14. void read()
  15. {
  16.     cin >> n >> m >> k;
  17.     for (int i = 1; i <= m; ++ i)
  18.     {
  19.         cin >> e[i].u >> e[i].v >> e[i].w;
  20.         Adj[e[i].u].push_back(i);
  21.         Adj[e[i].v].push_back(i);
  22.     }
  23. }
  24. struct TPQItem
  25. {
  26.     int u;
  27.     long long dlab;
  28.     bool operator < (const TPQItem & other) const
  29.     {
  30.         return other.dlab < dlab;
  31.     }
  32.     bool Valid(long long d[])
  33.     {
  34.         return d[u] == dlab;
  35.     }
  36. };
  37. priority_queue<TPQItem> PQ;
  38. bool Relax(long long d[], int u, int v, int w)
  39. {
  40.     if (d[v] > d[u] + w)
  41.     {
  42.         d[v] = d[u] + w;
  43.         return true;
  44.     }
  45.     return false;
  46. }
  47. void Dijkstra(int s, long long d[])
  48. {
  49.     fill(d + 1, d + n + 1, 1e18);
  50.     d[s] = 0;
  51.     PQ.push({s, 0});
  52.     while (!PQ.empty())
  53.     {
  54.         TPQItem r = PQ.top();
  55.         PQ.pop();
  56.         if (!r.Valid(d))
  57.         {
  58.             continue;
  59.         }
  60.         int u = r.u;
  61.         for (int i : Adj[u])
  62.         {
  63.             int v = e[i].u ^ e[i].v ^ u;
  64.             if (Relax(d, u, v, e[i].w))
  65.             {
  66.                 PQ.push({v, d[v]});
  67.             }
  68.         }
  69.     }
  70. }
  71. bool LF(int x, int y)
  72. {
  73.     return d1[x] * d2[y] < d1[y] * d2[x];
  74. }
  75. void solve()
  76. {
  77.    Dijkstra(1, d1);
  78.    Dijkstra(n, d2);
  79.    iota(id + 1, id + n + 1, 1);
  80.    sort(id + 2, id + n, LF);
  81.    l[0] = 1e18; r[n + 1] = 1e18;
  82.    for (int i = 1; i <= n; ++ i)
  83.    {
  84.        l[i] = min(l[i - 1], d2[id[i]]);
  85.    }
  86.    for (int i = n; i >= 1; -- i)
  87.    {
  88.        r[i] = min(r[i + 1], d1[id[i]]);
  89.    }
  90.    while (k --)
  91.    {
  92.        long long a, b;
  93.        cin >> a >> b;
  94.        int low = 1, high = n;
  95.        while (low <= high)
  96.        {
  97.            int mid = (low + high)/2;
  98.            int j = id[mid];
  99.            if (d1[j] * a < d2[j] * b)
  100.            {
  101.                low = mid + 1;
  102.            }
  103.            else
  104.            {
  105.                high = mid - 1;
  106.            }
  107.        }
  108.        cout << min(r[low] * a, l[high] * b) << '\n';
  109.    }
  110. }
  111. int main()
  112. {
  113.    ios_base::sync_with_stdio(false);
  114.    cin.tie(nullptr);
  115.    //freopen(TASK".INP", "r", stdin);
  116.    //freopen(TASK".OUT", "w", stdout);
  117.    int t = 1;
  118.    bool typetest = false;
  119.    if (typetest)
  120.    {
  121.       cin >> t;
  122.    }
  123.    for (int __ = 1; __ <= t; ++ __)
  124.    {
  125.       read();
  126.       solve();
  127.    }
  128. }
  129.  
Add Comment
Please, Sign In to add comment