@@ -40,6 +40,10 @@ public int getStartingNode(){
4040 return startingNode ;
4141 }
4242
43+ public int [] getSubtreeSizes (){
44+ return subtreeSizes ;
45+ }
46+
4347 public List <Integer >[] getCentroidTree (){
4448 return centroidTree ;
4549 }
@@ -59,52 +63,50 @@ public int getParent(int v){
5963 return centroidParent [v ];
6064 }
6165
62- public void findSubtreeSizes (int src , boolean [] visited , int [] subtreeSizes ){
66+ public void findSubtreeSizes (int src ){
6367 // dfs traversal to find size of subtree rooted at src
6468 visited [src ] = true ;
6569 subtreeSizes [src ] = 1 ;
6670 for (int node : tree [src ]){
6771 if (!visited [node ] && !centroidMarked [node ]){
6872 visited [node ] = true ;
69- findSubtreeSizes (node , visited , subtreeSizes ); // recurse down to last child node
73+ findSubtreeSizes (node ); // recurse down to last child node
7074 subtreeSizes [src ] += subtreeSizes [node ]; // add size of full recursive path to subtree Size of src
7175 }
7276 }
7377 }
7478
7579 public void findCentroid (int src , int previousCentroid ){
76- // int[] subtreeSizes = new int[N];
77- // boolean[] visited = new boolean[N];
80+
7881 Arrays .fill (visited , false );
7982
80- findSubtreeSizes (src , visited , subtreeSizes );
81- int treeSize = Arrays . stream ( subtreeSizes ). max (). getAsInt () ;
83+ findSubtreeSizes (src );
84+ int treeSize = subtreeSizes [ src ] ;
8285
83- centroidMarked [ src ] = true ;
86+ int heavyChild = - 1 ;
8487
8588 for (int node : tree [src ]){
86- if (subtreeSizes [node ] > (treeSize /2 )){
87- centroidMarked [src ] = false ;
89+ if (centroidMarked [node ]) continue ;
90+ if (subtreeSizes [node ] > (treeSize /2 )){
91+ heavyChild = node ;
8892 break ;
8993 }
9094 }
91-
92- if (centroidMarked [src ]){
93- if (src != startingNode && src != previousCentroid ) addEdgeCTree (previousCentroid , src );
94- for (int node : tree [src ]){
95- if (!centroidMarked [node ])
96- findCentroid (node , src );
97- }
95+
96+ if (heavyChild != -1 ){
97+ findCentroid (heavyChild , previousCentroid );
98+ return ;
9899 }
99- else {
100- int nextLargestSubtree = tree [src ].getFirst ();
101- for (int node : tree [src ]){
102- if (subtreeSizes [node ] >= subtreeSizes [nextLargestSubtree ])
103- nextLargestSubtree = node ;
100+
101+ centroidMarked [src ] = true ;
102+
103+ if (src != startingNode && src != previousCentroid ) addEdge (previousCentroid , src );
104+
105+ for (int node : tree [src ]){
106+ if (!centroidMarked [node ])
107+ findCentroid (node , src );
104108 }
105- findCentroid (nextLargestSubtree , previousCentroid );
106109 }
107- }
108110
109111 public static void main (String [] args ) {
110112 CentroidDecomposition cd = new CentroidDecomposition (16 );
0 commit comments