DuongNhi99

UPGRADE

Mar 4th, 2021 (edited)
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int64_t long long
  3. using namespace std;
  4.  
  5. const int N = 1e5 + 5;
  6. const int oo = 1000111000;
  7. typedef pair<int64_t, int> ii;
  8.  
  9. int n, m;
  10. vector<ii> graph[N];
  11. int64_t d[N];
  12. vector<int> pre[N];
  13.  
  14. void dijkstra() {
  15.     priority_queue<ii, vector<ii>, greater<ii>> pq;
  16.     fill(d + 1, d + n + 1, oo);
  17.     d[1] = 0;
  18.     pq.push(ii(0, 1));
  19.  
  20.     while(pq.size()) {
  21.         int u = pq.top().second;
  22.         int du = pq.top().first;
  23.         pq.pop();
  24.  
  25.         if(du != d[u]) continue;
  26.  
  27.         for(int i = 0; i < graph[u].size(); i++) {
  28.             int v = graph[u][i].second;
  29.             int uv = graph[u][i].first;
  30.  
  31.             if(d[v] > du + uv) {
  32.                 d[v] = du + uv;
  33.                 pre[v].clear();
  34.                 pre[v].push_back(u);
  35.                 pq.push(ii(d[v], v));
  36.             }
  37.             else if(d[v] == du + uv) {
  38.                 pre[v].push_back(u);
  39.             }
  40.         }
  41.     }
  42. }
  43.  
  44. vector<int> a[N];
  45. void build(int u) {
  46.     for(int v : pre[u]) {
  47.         a[u].push_back(v);
  48.         a[v].push_back(u);
  49.         build(v);
  50.     }
  51. }
  52.  
  53. int CriticalEdge = 0;
  54. int Num[N], Low[N], Time = 0;
  55.  
  56. void visit(int u, int p) {
  57.     Low[u] = Num[u] = ++Time;
  58.  
  59.     for(int v : a[u]) {
  60.         if(v != p) {
  61.             if(Num[v] != 0)
  62.                 Low[u] = min(Low[u], Num[v]);
  63.             else {
  64.                 visit(v, u);
  65.                 Low[u] = min(Low[u], Low[v]);
  66.  
  67.                 if(Low[v] >= Num[v])
  68.                     CriticalEdge++;
  69.             }
  70.         }
  71.     }
  72. }
  73.  
  74. int main() {
  75. #ifdef LOCAL
  76.     freopen("in.txt", "r", stdin);
  77. #else
  78.     freopen("UPGRADE.inp", "r", stdin);
  79.     freopen("UPGRADE.out", "w", stdout);
  80. #endif
  81.     ios_base::sync_with_stdio(false);
  82.     cin.tie(NULL); cout.tie(NULL);
  83.  
  84.     cin >> n >> m;
  85.     while(m--) {
  86.         int p, q, w; cin >> p >> q >> w;
  87.         graph[p].push_back(ii(w, q));
  88.         graph[q].push_back(ii(w, p));
  89.     }
  90.     dijkstra();
  91.     build(n);
  92.  
  93.     for(int i = 1; i <= n; i++)
  94.         if(!Num[i]) visit(i, i);
  95.  
  96.     cout << CriticalEdge;
  97.  
  98.     return 0;
  99. }
  100.  
Advertisement
Add Comment
Please, Sign In to add comment