@@ -30,7 +30,6 @@ public class Code05_Message1 {
3030 public static int [] maxPart = new int [MAXN ];
3131 public static int centroid ;
3232
33- public static int [] dep = new int [MAXN ];
3433 public static int [] depCnt = new int [MAXN ];
3534 public static int maxDeep ;
3635
@@ -41,21 +40,23 @@ public class Code05_Message1 {
4140 public static int [] ans = new int [MAXN ];
4241
4342 // 讲解118,递归函数改成迭代所需要的栈
44- public static int [][] stack = new int [MAXN ][3 ];
45- public static int stacksize , u , f , e ;
43+ public static int [][] stack = new int [MAXN ][4 ];
44+ public static int stacksize , u , f , dep , e ;
4645
47- public static void push (int u , int f , int e ) {
46+ public static void push (int u , int f , int dep , int e ) {
4847 stack [stacksize ][0 ] = u ;
4948 stack [stacksize ][1 ] = f ;
50- stack [stacksize ][2 ] = e ;
49+ stack [stacksize ][2 ] = dep ;
50+ stack [stacksize ][3 ] = e ;
5151 stacksize ++;
5252 }
5353
5454 public static void pop () {
5555 --stacksize ;
5656 u = stack [stacksize ][0 ];
5757 f = stack [stacksize ][1 ];
58- e = stack [stacksize ][2 ];
58+ dep = stack [stacksize ][2 ];
59+ e = stack [stacksize ][3 ];
5960 }
6061
6162 public static void addEdge (int u , int v ) {
@@ -92,7 +93,7 @@ public static void getCentroid1(int u, int fa) {
9293 // 找重心的迭代版
9394 public static void getCentroid2 (int cur , int fa ) {
9495 stacksize = 0 ;
95- push (cur , fa , -1 );
96+ push (cur , fa , 0 , -1 );
9697 while (stacksize > 0 ) {
9798 pop ();
9899 if (e == -1 ) {
@@ -103,10 +104,10 @@ public static void getCentroid2(int cur, int fa) {
103104 e = nextg [e ];
104105 }
105106 if (e != 0 ) {
106- push (u , f , e );
107+ push (u , f , 0 , e );
107108 int v = tog [e ];
108109 if (v != f && !vis [v ]) {
109- push (tog [e ], u , -1 );
110+ push (tog [e ], u , 0 , -1 );
110111 }
111112 } else {
112113 for (int ei = headg [u ]; ei > 0 ; ei = nextg [ei ]) {
@@ -125,37 +126,35 @@ public static void getCentroid2(int cur, int fa) {
125126 }
126127
127128 // 收集信息递归版,java会爆栈,C++可以通过
128- public static void dfs1 (int u , int fa ) {
129- dep [u ] = dep [fa ] + 1 ;
130- depCnt [dep [u ]]++;
131- maxDeep = Math .max (maxDeep , dep [u ]);
129+ public static void dfs1 (int u , int fa , int deep ) {
130+ depCnt [deep ]++;
131+ maxDeep = Math .max (maxDeep , deep );
132132 for (int e = headq [u ]; e > 0 ; e = nextq [e ]) {
133- if (tim [e ] + 1 >= dep [ u ] ) {
134- timArr [++cnta ] = tim [e ] - dep [ u ] + 2 ;
133+ if (tim [e ] + 1 >= deep ) {
134+ timArr [++cnta ] = tim [e ] - deep + 2 ;
135135 qidArr [cnta ] = qid [e ];
136136 }
137137 }
138138 for (int e = headg [u ]; e > 0 ; e = nextg [e ]) {
139139 int v = tog [e ];
140140 if (v != fa && !vis [v ]) {
141- dfs1 (v , u );
141+ dfs1 (v , u , deep + 1 );
142142 }
143143 }
144144 }
145145
146146 // 收集信息迭代版
147- public static void dfs2 (int cur , int fa ) {
147+ public static void dfs2 (int cur , int fa , int deep ) {
148148 stacksize = 0 ;
149- push (cur , fa , -1 );
149+ push (cur , fa , deep , -1 );
150150 while (stacksize > 0 ) {
151151 pop ();
152152 if (e == -1 ) {
153- dep [u ] = dep [f ] + 1 ;
154- depCnt [dep [u ]]++;
155- maxDeep = Math .max (maxDeep , dep [u ]);
153+ depCnt [dep ]++;
154+ maxDeep = Math .max (maxDeep , dep );
156155 for (int e = headq [u ]; e > 0 ; e = nextq [e ]) {
157- if (tim [e ] + 1 >= dep [ u ] ) {
158- timArr [++cnta ] = tim [e ] - dep [ u ] + 2 ;
156+ if (tim [e ] + 1 >= dep ) {
157+ timArr [++cnta ] = tim [e ] - dep + 2 ;
159158 qidArr [cnta ] = qid [e ];
160159 }
161160 }
@@ -164,10 +163,10 @@ public static void dfs2(int cur, int fa) {
164163 e = nextg [e ];
165164 }
166165 if (e != 0 ) {
167- push (u , f , e );
166+ push (u , f , dep , e );
168167 int v = tog [e ];
169168 if (v != f && !vis [v ]) {
170- push (tog [e ], u , -1 );
169+ push (tog [e ], u , dep + 1 , -1 );
171170 }
172171 }
173172 }
@@ -176,8 +175,8 @@ public static void dfs2(int cur, int fa) {
176175 public static void calc (int u ) {
177176 cnta = 0 ;
178177 maxDeep = 0 ;
179- // dfs1(u, 0);
180- dfs2 (u , 0 );
178+ // dfs1(u, 0, 1 );
179+ dfs2 (u , 0 , 1 );
181180 for (int i = 1 ; i <= cnta ; i ++) {
182181 ans [qidArr [i ]] += depCnt [timArr [i ]];
183182 }
@@ -189,8 +188,8 @@ public static void calc(int u) {
189188 if (!vis [v ]) {
190189 cnta = 0 ;
191190 maxDeep = 0 ;
192- // dfs1(v, u);
193- dfs2 (v , u );
191+ // dfs1(v, u, 2 );
192+ dfs2 (v , u , 2 );
194193 for (int i = 1 ; i <= cnta ; i ++) {
195194 ans [qidArr [i ]] -= depCnt [timArr [i ]];
196195 }
0 commit comments