2929 */
3030
3131public class CentroidDecomposition {
32- private final List <Integer >[] tree ;
33- private final List <Integer >[] centroidTree ;
32+ private final List <List < Integer >> tree ;
33+ private final List <List < Integer >> centroidTree ;
3434 private int [] subtreeSizes ;
3535 private boolean [] visited ;
3636 private boolean [] centroidMarked ;
3737 private int [] centroidParent ;
3838 private int startingNode ;
3939 private final int n ;
4040
41- @ SuppressWarnings ("unchecked" )
4241 public CentroidDecomposition (int n , int startingNode ) {
43- this .tree = ( List < Integer >[]) new ArrayList <?>[ n ] ;
44- this .centroidTree = ( List < Integer >[]) new ArrayList <?>[ n ] ;
42+ this .tree = new ArrayList <>() ;
43+ this .centroidTree = new ArrayList <>() ;
4544 this .n = n ;
4645 centroidMarked = new boolean [n ];
4746 centroidParent = new int [n ];
@@ -53,8 +52,8 @@ public CentroidDecomposition(int n, int startingNode) {
5352 this .startingNode = startingNode ;
5453 for (int i = 0 ; i < n ; i ++) {
5554 centroidParent [i ] = -1 ;
56- tree [ i ] = new ArrayList <>();
57- centroidTree [ i ] = new ArrayList <>();
55+ tree . add ( new ArrayList <>() );
56+ centroidTree . add ( new ArrayList <>() );
5857 }
5958 }
6059
@@ -69,7 +68,7 @@ public void build() {
6968
7069 public void reset () {
7170 for (int i = 0 ; i < n ; i ++) {
72- centroidTree [ i ] .clear ();
71+ centroidTree . get ( i ) .clear ();
7372 centroidParent [i ] = -1 ;
7473 subtreeSizes [i ] = 0 ;
7574 centroidMarked [i ] = false ;
@@ -86,17 +85,17 @@ public int[] getSubtreeSizes() {
8685 }
8786
8887 public void addEdgeTree (int u , int v ) {
89- tree [ u ] .add (v );
90- tree [ v ] .add (u );
88+ tree . get ( u ) .add (v );
89+ tree . get ( v ) .add (u );
9190 }
9291
9392 private void addEdgeCTree (int u , int v ) {
94- centroidTree [ u ] .add (v );
95- centroidTree [ v ] .add (u );
93+ centroidTree . get ( u ) .add (v );
94+ centroidTree . get ( v ) .add (u );
9695 centroidParent [v ] = u ;
9796 }
9897
99- public List <Integer >[] getCentroidTree () {
98+ public List <List < Integer >> getCentroidTree () {
10099 return centroidTree ;
101100 }
102101
@@ -105,7 +104,7 @@ public int getParent(int v) {
105104 }
106105
107106 public List <Integer > getCentroidChildren (int v ) {
108- return centroidTree [ v ] .stream ().filter (child -> centroidParent [child ] == v && centroidParent [v ] != child ).collect (Collectors .toList ());
107+ return centroidTree . get ( v ) .stream ().filter (child -> centroidParent [child ] == v && centroidParent [v ] != child ).collect (Collectors .toList ());
109108 }
110109
111110 public int getRoot () {
@@ -120,7 +119,7 @@ public int getRoot() {
120119 public void findSubtreeSizes (int src ) {
121120 visited [src ] = true ;
122121 subtreeSizes [src ] = 1 ;
123- for (int node : tree [ src ] ) {
122+ for (int node : tree . get ( src ) ) {
124123 if (!visited [node ] && !centroidMarked [node ]) {
125124 visited [node ] = true ;
126125 findSubtreeSizes (node );
@@ -135,7 +134,7 @@ public void findCentroid(int src, int previousCentroid) {
135134 int treeSize = subtreeSizes [src ];
136135 int heavyChild = -1 ;
137136
138- for (int node : tree [ src ] ) {
137+ for (int node : tree . get ( src ) ) {
139138 if (centroidMarked [node ]) {
140139 continue ;
141140 }
@@ -156,7 +155,7 @@ public void findCentroid(int src, int previousCentroid) {
156155 addEdgeCTree (previousCentroid , src );
157156 }
158157
159- for (int node : tree [ src ] ) {
158+ for (int node : tree . get ( src ) ) {
160159 if (!centroidMarked [node ]) {
161160 findCentroid (node , src );
162161 }
0 commit comments