Skip to content

Commit c2a6d3c

Browse files
committed
modify code
1 parent 0848f33 commit c2a6d3c

File tree

2 files changed

+40
-28
lines changed

2 files changed

+40
-28
lines changed

src/class183/Code02_Race1.java

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package class183;
22

33
// 权值和为k的路径的最少边数,java版
4+
// 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树
5+
// 给定数字k,要求路径权值和等于k,并且边的数量最小
6+
// 打印最小边数,如果不存在路径打印-1,注意点的编号从0开始
7+
// 1 <= n <= 2 * 10^5
8+
// 0 <= 边权、k <= 10^6
49
// 测试链接 : https://www.luogu.com.cn/problem/P4149
510
// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例
611

@@ -29,20 +34,20 @@ public class Code02_Race1 {
2934
public static int total;
3035
public static int centroid;
3136

32-
public static int[] sumArr = new int[MAXN];
37+
public static int[] disArr = new int[MAXN];
3338
public static int[] edgeArr = new int[MAXN];
3439
public static int cnta;
3540

3641
public static int[] dp = new int[MAXK];
3742

3843
// 讲解118,递归函数改成迭代所需要的栈
3944
public static int[][] stack = new int[MAXN][5];
40-
public static int stacksize, u, f, sum, edge, e;
45+
public static int stacksize, u, f, dis, edge, e;
4146

42-
public static void push(int u, int f, int sum, int edge, int e) {
47+
public static void push(int u, int f, int dis, int edge, int e) {
4348
stack[stacksize][0] = u;
4449
stack[stacksize][1] = f;
45-
stack[stacksize][2] = sum;
50+
stack[stacksize][2] = dis;
4651
stack[stacksize][3] = edge;
4752
stack[stacksize][4] = e;
4853
stacksize++;
@@ -52,7 +57,7 @@ public static void pop() {
5257
--stacksize;
5358
u = stack[stacksize][0];
5459
f = stack[stacksize][1];
55-
sum = stack[stacksize][2];
60+
dis = stack[stacksize][2];
5661
edge = stack[stacksize][3];
5762
e = stack[stacksize][4];
5863
}
@@ -118,41 +123,41 @@ public static void getCentroid2(int cur, int fa) {
118123
}
119124

120125
// 收集信息递归版,java会爆栈,C++可以通过
121-
public static void dfs1(int u, int fa, int sum, int edge) {
122-
if (sum > k) {
126+
public static void dfs1(int u, int fa, int dis, int edge) {
127+
if (dis > k) {
123128
return;
124129
}
125-
sumArr[++cnta] = sum;
130+
disArr[++cnta] = dis;
126131
edgeArr[cnta] = edge;
127132
for (int e = head[u]; e > 0; e = nxt[e]) {
128133
int v = to[e];
129134
if (v != fa && !vis[v]) {
130-
dfs1(v, u, sum + weight[e], edge + 1);
135+
dfs1(v, u, dis + weight[e], edge + 1);
131136
}
132137
}
133138
}
134139

135140
// 收集信息的迭代版
136-
public static void dfs2(int cur, int fa, int psum, int pedge) {
141+
public static void dfs2(int cur, int fa, int pathDis, int pathEdge) {
137142
stacksize = 0;
138-
push(cur, fa, psum, pedge, -1);
143+
push(cur, fa, pathDis, pathEdge, -1);
139144
while (stacksize > 0) {
140145
pop();
141146
if (e == -1) {
142-
if (sum > k) {
147+
if (dis > k) {
143148
continue;
144149
}
145-
sumArr[++cnta] = sum;
150+
disArr[++cnta] = dis;
146151
edgeArr[cnta] = edge;
147152
e = head[u];
148153
} else {
149154
e = nxt[e];
150155
}
151156
if (e != 0) {
152-
push(u, f, sum, edge, e);
157+
push(u, f, dis, edge, e);
153158
int v = to[e];
154159
if (v != f && !vis[v]) {
155-
push(to[e], u, sum + weight[e], edge + 1, -1);
160+
push(to[e], u, dis + weight[e], edge + 1, -1);
156161
}
157162
}
158163
}
@@ -169,15 +174,15 @@ public static int calc(int u) {
169174
// dfs1(v, u, weight[e], 1);
170175
dfs2(v, u, weight[e], 1);
171176
for (int i = tmp + 1; i <= cnta; i++) {
172-
ans = Math.min(ans, dp[k - sumArr[i]] + edgeArr[i]);
177+
ans = Math.min(ans, dp[k - disArr[i]] + edgeArr[i]);
173178
}
174179
for (int i = tmp + 1; i <= cnta; i++) {
175-
dp[sumArr[i]] = Math.min(dp[sumArr[i]], edgeArr[i]);
180+
dp[disArr[i]] = Math.min(dp[disArr[i]], edgeArr[i]);
176181
}
177182
}
178183
}
179184
for (int i = 1; i <= cnta; i++) {
180-
dp[sumArr[i]] = INF;
185+
dp[disArr[i]] = INF;
181186
}
182187
return ans;
183188
}

src/class183/Code02_Race2.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package class183;
22

33
// 权值和为k的路径的最少边数,C++版
4+
// 一共有n个节点,给定n-1条边,每条边有边权,所有节点组成一棵树
5+
// 给定数字k,要求路径权值和等于k,并且边的数量最小
6+
// 打印最小边数,如果不存在路径打印-1,注意点的编号从0开始
7+
// 1 <= n <= 2 * 10^5
8+
// 0 <= 边权、k <= 10^6
49
// 测试链接 : https://www.luogu.com.cn/problem/P4149
510
// 如下实现是C++的版本,C++版本和java版本逻辑完全一样
611
// 提交如下代码,可以通过所有测试用例
@@ -9,6 +14,10 @@
914
//
1015
//using namespace std;
1116
//
17+
//struct Node {
18+
// int dis, edge;
19+
//};
20+
//
1221
//const int MAXN = 200001;
1322
//const int MAXK = 1000001;
1423
//const int INF = 1000000001;
@@ -26,8 +35,7 @@
2635
//int total;
2736
//int centroid;
2837
//
29-
//int sumArr[MAXN];
30-
//int edgeArr[MAXN];
38+
//Node arr[MAXN];
3139
//int cnta;
3240
//
3341
//int dp[MAXK];
@@ -56,16 +64,15 @@
5664
// }
5765
//}
5866
//
59-
//void dfs(int u, int fa, int sum, int edge) {
60-
// if (sum > k) {
67+
//void dfs(int u, int fa, int dis, int edge) {
68+
// if (dis > k) {
6169
// return;
6270
// }
63-
// sumArr[++cnta] = sum;
64-
// edgeArr[cnta] = edge;
71+
// arr[++cnta] = { dis, edge };
6572
// for (int e = head[u]; e; e = nxt[e]) {
6673
// int v = to[e];
6774
// if (v != fa && !vis[v]) {
68-
// dfs(v, u, sum + weight[e], edge + 1);
75+
// dfs(v, u, dis + weight[e], edge + 1);
6976
// }
7077
// }
7178
//}
@@ -80,15 +87,15 @@
8087
// int tmp = cnta;
8188
// dfs(v, u, weight[e], 1);
8289
// for (int i = tmp + 1; i <= cnta; i++) {
83-
// ans = min(ans, dp[k - sumArr[i]] + edgeArr[i]);
90+
// ans = min(ans, dp[k - arr[i].dis] + arr[i].edge);
8491
// }
8592
// for (int i = tmp + 1; i <= cnta; i++) {
86-
// dp[sumArr[i]] = min(dp[sumArr[i]], edgeArr[i]);
93+
// dp[arr[i].dis] = min(dp[arr[i].dis], arr[i].edge);
8794
// }
8895
// }
8996
// }
9097
// for (int i = 1; i <= cnta; i++) {
91-
// dp[sumArr[i]] = INF;
98+
// dp[arr[i].dis] = INF;
9299
// }
93100
// return ans;
94101
//}

0 commit comments

Comments
 (0)