Advertisement
Jasir

Centroid Decomposition

Apr 30th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.90 KB | None | 0 0
  1.  
  2. int nn,sub[100008],par[100008];
  3. set<int> gset[100008];
  4.  
  5.  
  6. void dfs1(int u,int p){
  7.     sub[u]=1;
  8.     nn++;
  9.     if(gset[u].empty())return;
  10.     for(set <int> :: iterator it = gset[u].begin();it != gset[u].end(); ++it){
  11.         if(*it!=p){
  12.             dfs1(*it,u);
  13.             sub[u]+=sub[*it];
  14.         }
  15.     }
  16. }
  17. int dfs2(int u,int p){
  18.     if(gset[u].empty())return u;
  19.     for(set <int> :: iterator it = gset[u].begin();it != gset[u].end(); ++it){
  20.         if(*it!=p && sub[*it]>nn/2){
  21.             return dfs2(*it,u);
  22.         }
  23.     }
  24.     return u;
  25. }
  26. void decompose(int root,int p) { // call decompose(1,-1)
  27.     nn=0;
  28.     dfs1(root,root);
  29.     int centroid = dfs2(root,root);
  30.     if(p==-1) p=centroid;
  31.     par[centroid] = p;
  32.     if(gset[centroid].empty())return;
  33.     for(set <int> :: iterator it=gset[centroid].begin();it!=gset[centroid].end();++it){
  34.         gset[*it].erase(centroid);
  35.         decompose(*it,centroid);
  36.     }
  37.     gset[centroid].clear();
  38. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement