Advertisement
Alex_tz307

USACO 2018 December Contest, Gold Problem 1. Fine Dining

May 30th, 2021
783
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.32 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define INF 0x3f3f3f3f
  3.  
  4. using namespace std;
  5.  
  6. ifstream fin("dining.in");
  7. ofstream fout("dining.out");
  8.  
  9. const int MAXN = 5e4 + 1;
  10. vector<pair<int,int>> G[MAXN];
  11. int node[MAXN], cost[MAXN], dp[MAXN], d[MAXN];
  12.  
  13. void Dijkstra(int n) {
  14.   for (int u = 0; u < n; ++u)
  15.     dp[u] = INF;  
  16.   priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;
  17.   pq.emplace(0, n);
  18.   while (!pq.empty()) {
  19.     int d, u;
  20.     tie(d, u) = pq.top();
  21.     pq.pop();
  22.     if (dp[u] != d)
  23.       continue;
  24.     for (auto it : G[u]) {
  25.       int v, w;
  26.       tie(v, w) = it;
  27.       if (dp[v] > d + w) {
  28.         dp[v] = d + w;
  29.         pq.emplace(dp[v], v);
  30.       }
  31.     }
  32.   }
  33. }
  34.  
  35. int main() {
  36.   int n, m, k;
  37.   fin >> n >> m >> k;
  38.   for (int i = 0; i < m; ++i) {
  39.     int u, v, w;
  40.     fin >> u >> v >> w;
  41.     --u, --v;
  42.     G[u].emplace_back(v, w);
  43.     G[v].emplace_back(u, w);
  44.   }
  45.   for (int i = 0; i < k; ++i) {
  46.     fin >> node[i] >> cost[i];
  47.     --node[i];
  48.   }
  49.   Dijkstra(n - 1);
  50.   for (int u = 0; u < n - 1; ++u)
  51.     d[u] = dp[u];
  52.   for (int i = 0; i < k; ++i)
  53.     G[n].emplace_back(node[i], d[node[i]] - cost[i]);
  54.   Dijkstra(n);
  55.   for (int u = 0; u < n - 1; ++u)
  56.     if (dp[u] <= d[u])
  57.       fout << "1\n";
  58.     else fout << "0\n";
  59.   fin.close();
  60.   fout.close();
  61.   return 0;
  62. }
  63.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement