CodeForces-449B.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #include <functional>
  2. #include <iostream>
  3. #include <limits>
  4. #include <queue>
  5. #include <tuple>
  6. #include <utility>
  7. #include <vector>
  8. using namespace std;
  9. struct Edge { int to; long long weight; };
  10. int main() {
  11. ios::sync_with_stdio(false);
  12. cin.tie(nullptr);
  13. int n, m, k; cin >> n >> m >> k;
  14. vector<vector<Edge>> g(n);
  15. vector<tuple<int, int, long long>> roads;
  16. for (int i = 0; i < m; ++i) {
  17. int u, v; long long w; cin >> u >> v >> w; --u; --v;
  18. g[u].push_back({v, w}); g[v].push_back({u, w});
  19. roads.push_back({u, v, w});
  20. }
  21. const long long inf = numeric_limits<long long>::max() / 4;
  22. vector<long long> train(n, inf), dist(n, inf);
  23. for (int i = 0; i < k; ++i) {
  24. int v; long long w; cin >> v >> w; --v;
  25. train[v] = min(train[v], w);
  26. }
  27. priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<>> pq;
  28. dist[0] = 0; pq.push({0, 0});
  29. for (int v = 1; v < n; ++v) if (train[v] < inf) {
  30. dist[v] = train[v]; pq.push({dist[v], v});
  31. }
  32. while (!pq.empty()) {
  33. auto [d, u] = pq.top(); pq.pop();
  34. if (d != dist[u]) continue;
  35. for (Edge e : g[u]) if (dist[e.to] > d + e.weight) {
  36. dist[e.to] = d + e.weight; pq.push({dist[e.to], e.to});
  37. }
  38. }
  39. vector<bool> road_predecessor(n, false);
  40. for (auto [u, v, w] : roads) {
  41. if (dist[u] + w == dist[v]) road_predecessor[v] = true;
  42. if (dist[v] + w == dist[u]) road_predecessor[u] = true;
  43. }
  44. int needed = 0;
  45. for (int v = 1; v < n; ++v) {
  46. if (train[v] == dist[v] && !road_predecessor[v]) ++needed;
  47. }
  48. cout << k - needed << '\n';
  49. }