@@ -12,31 +12,28 @@ public class CentroidDecomposition {
1212 private int startingNode ;
1313 private int N ;
1414
15+ @ SuppressWarnings ("unchecked" )
1516 public CentroidDecomposition (int n , int startingNode ){
1617 tree = new ArrayList [n ];
1718 centroidTree = new ArrayList [n ];
1819 N = n ;
19- for (int i = 0 ; i < centroidTree .length ; i ++) centroidTree [i ] = new ArrayList <>();
20- for (int i = 0 ; i < tree .length ; i ++) tree [i ] = new ArrayList <>();
2120 centroidMarked = new boolean [n ];
2221 centroidParent = new int [n ];
23- startingNode = (int )(Math .random () * n +1 );
22+ if (startingNode < 0 || startingNode > n -1 ){
23+ throw new IllegalArgumentException ("Starting node must be in range 0.." + (n - 1 ) + " but got " + startingNode );
24+ }
2425 for (int i = 0 ; i <n ; i ++){
2526 tree [i ] = new ArrayList <>();
27+ centroidTree [i ] = new ArrayList <>();
2628 }
2729 }
30+
2831 public CentroidDecomposition (int n ){
29- tree = new ArrayList [n ];
30- centroidTree = new ArrayList [n ];
31- centroidMarked = new boolean [n ];
32- centroidParent = new int [n ];
33- startingNode = (this .startingNode == -1 ) ? (int )(Math .random () * n +1 ) : this .startingNode ;
34- N = n ;
35- for (int i = 0 ; i < centroidTree .length ; i ++) centroidTree [i ] = new ArrayList <>();
36- for (int i = 0 ; i < tree .length ; i ++) tree [i ] = new ArrayList <>();
37- for (int i = 0 ; i <n ; i ++){
38- tree [i ] = new ArrayList <>();
39- }
32+ this (n , (int )(Math .random () * n ));
33+ }
34+
35+ public int getStartingNode (){
36+ return startingNode ;
4037 }
4138
4239 public List <Integer >[] getCentroidTree (){
@@ -54,7 +51,6 @@ private void addEdgeCTree(int u, int v){
5451 centroidParent [v ] = u ;
5552 }
5653
57-
5854 public void findSubtreeSizes (int src , boolean [] visited , int [] subtreeSizes ){
5955 // dfs traversal to find size of subtree rooted at src
6056 visited [src ] = true ;
@@ -87,14 +83,12 @@ public void findCentroid(int src, int previousCentroid){
8783
8884 if (centroidMarked [src ]){
8985 if (src != startingNode && src != previousCentroid ) addEdgeCTree (previousCentroid , src );
90- // centroidTree[previousCentroid].add(src);
9186 for (int node : tree [src ]){
9287 if (!centroidMarked [node ])
9388 findCentroid (node , src );
9489 }
9590 }
9691 else {
97- // pick one of the children of the root for next check
9892 int nextLargestSubtree = tree [src ].getFirst ();
9993 for (int node : tree [src ]){
10094 if (subtreeSizes [node ] >= subtreeSizes [nextLargestSubtree ])
@@ -105,7 +99,7 @@ public void findCentroid(int src, int previousCentroid){
10599 }
106100
107101 public static void main (String [] args ) {
108- CentroidDecomposition cd = new CentroidDecomposition (16 , - 1 );
102+ CentroidDecomposition cd = new CentroidDecomposition (16 );
109103 cd .addEdge (0 , 1 );
110104 cd .addEdge (0 , 2 );
111105 cd .addEdge (0 , 3 );
@@ -126,7 +120,7 @@ public static void main(String[] args) {
126120 int [] subtreeSizes = new int [16 ];
127121
128122 // int start = cd.startingNode;
129- int src = (int ) (( Math .random () * ( 15 )) + 0 );
123+ int src = (int )( Math .random () * 15 );
130124 System .out .println ("src= " + src );
131125
132126 cd .findCentroid (src , src );
0 commit comments