Advertisement
Guest User

VINMAZE - buggy solution

a guest
Mar 1st, 2021
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.09 KB | None | 0 0
  1. #include<iostream>
  2. #include<vector>
  3. #include<queue>
  4. #include<utility>
  5. #include<limits.h>
  6. using namespace std;
  7.  
  8. using LL = long long;
  9. using VI = vector<int>;
  10. using VVI = vector<VI>;
  11. using VL = vector<LL>;
  12. using ANODE = pair<int, int>;
  13. using VANODE = vector<ANODE>;
  14. using VVANODE = vector<VANODE>;
  15. using EDGE = pair<int, ANODE>;
  16.  
  17. VL dijsktra(vector<VANODE> &adj, int verts, int source) {
  18.     const LL INF = LLONG_MAX;
  19.  
  20.     VL distances(verts + 1, INF);
  21.     distances[source] = 0;
  22.  
  23.     using QNODE = pair<LL, int>;
  24.     priority_queue<QNODE, vector<QNODE>, greater<>> pq;
  25.     pq.push({ distances[source], source });
  26.  
  27.     while (not pq.empty()) {
  28.         auto node = pq.top().second;
  29.         pq.pop();
  30.  
  31.         if (distances[node] == INF) continue;
  32.  
  33.         for (auto neigh : adj[node]) {
  34.             auto weight = neigh.second;
  35.             auto vert = neigh.first;
  36.             auto new_dist = distances[node] + weight;
  37.  
  38.             if (new_dist < distances[vert]) {
  39.                 distances[vert] = new_dist;
  40.  
  41.                 QNODE newnode = { distances[vert], vert };
  42.                 pq.push(newnode);
  43.             }
  44.         }
  45.     }
  46.  
  47.     return distances;
  48. }
  49.  
  50. bool belongs(EDGE &edge, VL &dist_s, VL &dist_t, LL shortest_path_len) {
  51.     int u = edge.first;
  52.     int v = edge.second.first;
  53.     int w = edge.second.second;
  54.  
  55.     LL sum1 = dist_s[u] + w + dist_t[v];
  56.     LL sum2 = dist_s[v] + w + dist_t[u];
  57.  
  58.     return sum2 == shortest_path_len or sum1 == shortest_path_len;
  59. }
  60.  
  61. int main() {
  62.     int n, m; cin >> n >> m;
  63.  
  64.     vector<EDGE> edges;
  65.     VVANODE adj(n + 1);
  66.  
  67.     for (int _ = 1; _ <= m; _++) {
  68.         int u, v, w; cin >> u >> v >> w;
  69.  
  70.         adj[u].push_back({ v, w });
  71.         adj[v].push_back({ u, w });
  72.         edges.push_back({u, {v, w}});
  73.     }
  74.  
  75.     int s = 1, t = n;
  76.     auto dist_s = dijsktra(adj, n, s);
  77.     auto dist_t = dijsktra(adj, n, t);
  78.    
  79.     int count = 0;
  80.     for (auto &edge : edges) {
  81.         if (belongs(edge, dist_s, dist_t, dist_s[t])) {
  82.             count += 1;
  83.         }
  84.     }
  85.  
  86.     cout << count << endl;
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement