Skip to content

Commit 1c36d89

Browse files
committed
modify code
1 parent 3f5d000 commit 1c36d89

File tree

1 file changed

+28
-29
lines changed

1 file changed

+28
-29
lines changed

src/class183/Code05_Message1.java

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)