Advertisement
newb_ie

CF - Jzzhu and Cities

Mar 13th, 2021
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxN = 1e5 + 100;
  5. vector<pair<pair<int64_t,int64_t>,bool>> adj[maxN];
  6. int64_t cost[maxN];
  7. bool used[maxN];
  8.  
  9. void dijkstra (int n) {
  10.     for (int i = 1; i <= n; ++i) cost[i] = LLONG_MAX;
  11.     cost[1] = 0;
  12.     priority_queue<pair<int64_t,int64_t>> pq;
  13.     pq.push(make_pair(0,1));
  14.     while (!pq.empty()) {
  15.         int64_t node = pq.top().second;
  16.         int64_t node_cost = abs(pq.top().first);
  17.         pq.pop();
  18.         if (cost[node] < node_cost) continue;
  19.         for (pair<pair<int64_t,int64_t>,bool> child : adj[node]) {
  20.             if (cost[child.first.first] >= node_cost + child.first.second) {
  21.                 if (cost[child.first.first] == node_cost + child.first.second and used[child.first.first] and !child.second) {
  22.                     cost[child.first.first] = node_cost + child.first.second;
  23.                     used[child.first.first] = false;
  24.                     pq.push(make_pair(-cost[child.first.first],child.first.first));
  25.                 } else {
  26.                     if (cost[child.first.first] > node_cost + child.first.second) {
  27.                         used[child.first.first] = child.second;
  28.                         cost[child.first.first] = node_cost + child.first.second;
  29.                         pq.push(make_pair(-cost[child.first.first],child.first.first));
  30.                     }
  31.                 }
  32.             }
  33.         }
  34.     }
  35. }
  36.  
  37. int main () {
  38.      ios::sync_with_stdio(false);
  39.      cin.tie(nullptr);
  40.      cout.tie(nullptr);
  41.      int T = 1;
  42.      //~ cin >> T;
  43.      for (int test_case = 1; test_case <= T; ++test_case) {
  44.          int n,m,k;
  45.          cin >> n >> m >> k;
  46.          for (int i = 1; i <= m; ++i) {
  47.              int64_t u,v,c;
  48.              cin >> u >> v >> c;
  49.              adj[u].push_back(make_pair(make_pair(v,c),false));
  50.              adj[v].push_back(make_pair(make_pair(u,c),false));
  51.          }
  52.          for (int i = 1; i <= k; ++i) {
  53.              int64_t v,c;
  54.              cin >> v >> c;
  55.              adj[1].push_back(make_pair(make_pair(v,c),true));
  56.              adj[v].push_back(make_pair(make_pair(1,c),true));
  57.          }
  58.          dijkstra(n);
  59.          int res = 0;
  60.          for (int i = 1; i <= n; ++i) res += used[i];
  61.          cout << k - res << '\n';
  62.      }
  63.      //cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms" << '\n';
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement