Advertisement
_no0B

Untitled

Mar 18th, 2020
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.04 KB | None | 0 0
  1. int dfs(int n, int p){
  2.     par[0][n] = p;
  3.     lv[n] = lv[p]+1;
  4.     deg[n] = 0;
  5.     int cntt = 1, mx = 0, b = 0;
  6.     for(int i = 0; i<v[n].size(); i++){
  7.         int a = v[n][i];
  8.         if(a!=p){
  9.             deg[n]++;
  10.             int tmp = dfs(a,n);
  11.             cntt += tmp;
  12.             if(mx<tmp){
  13.                 mx = tmp;
  14.                 b = a;
  15.             }
  16.             mark[a] = 0;
  17.         }
  18.     }
  19.     if(mx*2>=cntt){
  20.         mark[b] = 1;
  21.     }
  22.     return cntt;
  23. }
  24. int fun(int n){
  25.     path[n] = cnt++;
  26.     id[path[n]] = n;
  27.     if(mark[n]==0){
  28.         deg[par[0][n]]--;
  29.         if(deg[par[0][n]]==0) q.push(par[0][n]);
  30.         last[n] = n;
  31.     }
  32.     else last[n] = fun(par[0][n]);
  33.     return last[n];
  34. }
  35. void hld(int n){
  36.     mark[1] = 0;
  37.     dfs(1,0);
  38.     for(int i = 1; i<=n; i++) if(deg[i]==0) q.push(i);
  39.     cnt = 1;
  40.     while(!q.empty()){
  41.         int a = q.front();
  42.         q.pop();
  43.         fun(a);
  44.     }
  45.     for(int i = 1; i<=logn; i++)
  46.         for(int j = 1; j<=n; j++) par[i][j] = par[i-1][par[i-1][j]];
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement