33import java .util .ArrayList ;
44import java .util .Arrays ;
55import java .util .List ;
6+ import java .util .stream .Collector ;
7+ import java .util .stream .Collectors ;
68
79public class CentroidDecomposition {
8- private List <Integer >[] tree ;
9- private List <Integer >[] centroidTree ;
10+ private ArrayList <Integer >[] tree ;
11+ private ArrayList <Integer >[] centroidTree ;
1012 private int [] subtreeSizes ;
1113 private boolean [] visited ;
1214 private boolean [] centroidMarked ;
@@ -27,6 +29,7 @@ public CentroidDecomposition(int n, int startingNode){
2729 throw new IllegalArgumentException ("Starting node must be in range 0.." + (n - 1 ) + " but got " + startingNode );
2830 }
2931 for (int i = 0 ; i <n ; i ++){
32+ centroidParent [i ] = -1 ;
3033 tree [i ] = new ArrayList <>();
3134 centroidTree [i ] = new ArrayList <>();
3235 }
@@ -36,6 +39,20 @@ public CentroidDecomposition(int n){
3639 this (n , (int )(Math .random () * n ));
3740 }
3841
42+ public void build (){
43+ findCentroid (startingNode , startingNode );
44+ }
45+
46+ public void reset (){
47+ for (int i = 0 ; i <N ; i ++){
48+ centroidTree [i ] = new ArrayList <>();
49+ centroidParent [i ] = -1 ;
50+ subtreeSizes [i ] = 0 ;
51+ centroidMarked [i ] = false ;
52+ visited [i ] = false ;
53+ }
54+ }
55+
3956 public int getStartingNode (){
4057 return startingNode ;
4158 }
@@ -44,11 +61,7 @@ public int[] getSubtreeSizes(){
4461 return subtreeSizes ;
4562 }
4663
47- public List <Integer >[] getCentroidTree (){
48- return centroidTree ;
49- }
50-
51- public void addEdge (int u , int v ){
64+ public void addEdgeTree (int u , int v ){
5265 tree [u ].add (v );
5366 tree [v ].add (u );
5467 }
@@ -59,19 +72,22 @@ private void addEdgeCTree(int u, int v){
5972 centroidParent [v ] = u ;
6073 }
6174
75+ public ArrayList <Integer >[] getCentroidTree (){
76+ return centroidTree ;
77+ }
78+
6279 public int getParent (int v ){
6380 return centroidParent [v ];
6481 }
6582
6683 public void findSubtreeSizes (int src ){
67- // dfs traversal to find size of subtree rooted at src
6884 visited [src ] = true ;
6985 subtreeSizes [src ] = 1 ;
7086 for (int node : tree [src ]){
7187 if (!visited [node ] && !centroidMarked [node ]){
7288 visited [node ] = true ;
73- findSubtreeSizes (node ); // recurse down to last child node
74- subtreeSizes [src ] += subtreeSizes [node ]; // add size of full recursive path to subtree Size of src
89+ findSubtreeSizes (node );
90+ subtreeSizes [src ] += subtreeSizes [node ];
7591 }
7692 }
7793 }
@@ -100,7 +116,7 @@ public void findCentroid(int src, int previousCentroid){
100116
101117 centroidMarked [src ] = true ;
102118
103- if (src != startingNode && src != previousCentroid ) addEdge (previousCentroid , src );
119+ if (src != startingNode && src != previousCentroid ) addEdgeCTree (previousCentroid , src );
104120
105121 for (int node : tree [src ]){
106122 if (!centroidMarked [node ])
@@ -110,30 +126,30 @@ public void findCentroid(int src, int previousCentroid){
110126
111127 public static void main (String [] args ) {
112128 CentroidDecomposition cd = new CentroidDecomposition (16 );
113- cd .addEdge (0 , 1 );
114- cd .addEdge (0 , 2 );
115- cd .addEdge (0 , 3 );
116- cd .addEdge (1 , 4 );
117- cd .addEdge (1 , 5 );
118- cd .addEdge (2 , 6 );
119- cd .addEdge (2 , 7 );
120- cd .addEdge (3 , 8 );
121- cd .addEdge (8 , 9 );
122- cd .addEdge (8 , 10 );
123- cd .addEdge (6 , 11 );
124- cd .addEdge (11 , 12 );
125- cd .addEdge (11 , 13 );
126- cd .addEdge (13 , 14 );
127- cd .addEdge (14 , 15 );
128-
129- boolean [] visited = new boolean [16 ];
130- int [] subtreeSizes = new int [16 ];
129+ cd .addEdgeTree (0 , 1 );
130+ cd .addEdgeTree (0 , 2 );
131+ cd .addEdgeTree (0 , 3 );
132+ cd .addEdgeTree (1 , 4 );
133+ cd .addEdgeTree (1 , 5 );
134+ cd .addEdgeTree (2 , 6 );
135+ cd .addEdgeTree (2 , 7 );
136+ cd .addEdgeTree (3 , 8 );
137+ cd .addEdgeTree (8 , 9 );
138+ cd .addEdgeTree (8 , 10 );
139+ cd .addEdgeTree (6 , 11 );
140+ cd .addEdgeTree (11 , 12 );
141+ cd .addEdgeTree (11 , 13 );
142+ cd .addEdgeTree (13 , 14 );
143+ cd .addEdgeTree (14 , 15 );
144+
145+ // boolean[] visited = new boolean[16];
146+ // int[] subtreeSizes = new int[16];
131147
132148 // int start = cd.startingNode;
133- int src = (int )(Math .random () * 15 );
134- System .out .println ("src= " + src );
135-
136- cd .findCentroid (src , src );
149+ // int src = (int)(Math.random() * 15);
150+ // System.out.println("src= " + src);
151+ int start = cd . getStartingNode ();
152+ cd .findCentroid (start , start );
137153
138154 // System.out.println((int)(Math.random() * 16));
139155
0 commit comments