Advertisement
mickypinata

SMMR-T155: London Bridge

Apr 14th, 2020
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <stack>
  4. using namespace std;
  5.  
  6. #define pii pair<int, int>
  7.  
  8. stack<pii> edges;
  9. vector<int> DSet;
  10. vector<int> ranks;
  11. int nv, ne;
  12.  
  13. int DSFind(int x){
  14.     if(DSet[x] == x){
  15.         return x;
  16.     } else {
  17.         return DSet[x] = DSFind(DSet[x]);
  18.     }
  19. }
  20.  
  21. void DSUnion(int x, int y){
  22.     int hx = DSFind(x);
  23.     int hy = DSFind(y);
  24.     if(ranks[hx] > ranks[hy]){
  25.         DSet[hy] = hx;
  26.     } else {
  27.         DSet[hx] = hy;
  28.         if(ranks[hx] == ranks[hy]){
  29.             ++ranks[hy];
  30.         }
  31.     }
  32.     return;
  33. }
  34.  
  35. int main(){
  36.  
  37.     int u, v, need;
  38.  
  39.     scanf("%d %d", &nv, &ne);
  40.     DSet.assign(nv + 1, 0);
  41.     ranks.assign(nv + 1, 1);
  42.     for(int i = 1; i <= nv; ++i){
  43.         DSet[i] = i;
  44.     }
  45.  
  46.     for(int i = 1; i <= ne; ++i){
  47.         scanf("%d %d", &u, &v);
  48.         edges.push({u, v});
  49.     }
  50.  
  51.     need = 0;
  52.     for(int i = 1; i <= ne && !edges.empty(); ++i){
  53.         int u = edges.top().first;
  54.         int v = edges.top().second;
  55.         edges.pop();
  56.         if(DSFind(u) != DSFind(v)){
  57.             DSUnion(u, v);
  58.             need = i;
  59.         }
  60.     }
  61.  
  62.     cout << ne - need;
  63.  
  64.     return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement