Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.66 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3.  
  4. #define NMax 100010
  5. #define pb push_back
  6. #define INF 0x3f3f3f3f
  7.  
  8. using namespace std;
  9.  
  10. int n, m, k, u, v, sol, used[NMax];
  11. bool relaxed[4 * NMax];
  12. long long cost[4 * NMax], d[NMax], x;
  13. priority_queue<pair<int, long long>> Q;
  14. vector<pair<int, int>> G[NMax];
  15.  
  16. int main() {
  17.  
  18. cin >> n >> m >> k;
  19. for (int i = 0; i < m; i++) {
  20. cin >> u >> v >> x;
  21. G[u].pb(make_pair(v, i));
  22. G[v].pb(make_pair(u, i));
  23. cost[i] = x;
  24. }
  25.  
  26. for (int i = 0; i < k; i++) {
  27. cin >> u >> x;
  28. G[1].pb(make_pair(u, m + i));
  29. G[u].pb(make_pair(1, m + i));
  30. cost[m + i] = x;
  31. }
  32.  
  33. for (int i = 1; i <= n; i++) {
  34. d[i] = INF;
  35. used[i] = -1;
  36. }
  37. d[1] = 0;
  38. Q.push(make_pair(1, 0));
  39.  
  40. while (!Q.empty()) {
  41. int nod = Q.top().first;
  42. long long dist = -Q.top().second;
  43. Q.pop();
  44.  
  45. if(dist > d[nod]) {
  46. continue;
  47. }
  48.  
  49. for (auto x : G[nod]) {
  50. int adj = x.first;
  51. int edge = x.second;
  52.  
  53. if (d[adj] > dist + cost[edge]) {
  54. d[adj] = dist + cost[edge];
  55. used[adj] = edge;
  56. Q.push(make_pair(adj, -d[adj]));
  57. } else if (d[adj] == dist + cost[edge] && edge < m) {
  58. used[adj] = edge;
  59. }
  60. }
  61. }
  62. for (int i = 1; i <= n; i++) {
  63. if (used[i] != -1) {
  64. relaxed[used[i]] = true;
  65. }
  66. }
  67. for (int i = m; i < m + k; i++) {
  68. if (!relaxed[i]) {
  69. sol++;
  70. }
  71. }
  72. cout << sol << '\n';
  73. return 0;
  74. }
  75. close
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement