Skip to content

Commit c8f895d

Browse files
committed
modify code
1 parent 4cb88f5 commit c8f895d

File tree

2 files changed

+167
-2
lines changed

2 files changed

+167
-2
lines changed

src/class183/Code04_CloseVertices1.java

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

3-
// 相近的点对数量,java版
3+
// 相近点对的数量,java版
4+
// 一共有n个节点,所有节点组成一棵树,1号节点是树头
5+
// 从2号点开始,给定每个点的父节点编号、与父节点之间无向边的边权
6+
// 给定两个整数limitl、limitw,如下为(a, b)是相近点对的定义
7+
// 首先a < b,其次两者简单路径的边数不超过limitl、权值和不超过limitw
8+
// 打印树上有多少相近点对
9+
// 1 <= limitl <= n <= 10^5
10+
// 0 <= limitw <= 10^9
11+
// 0 <= 边权 <= 10^4
412
// 测试链接 : https://www.luogu.com.cn/problem/CF293E
513
// 测试链接 : https://codeforces.com/problemset/problem/293/E
614
// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例
@@ -12,7 +20,7 @@
1220

1321
public class Code04_CloseVertices1 {
1422

15-
public static int MAXN = 100005;
23+
public static int MAXN = 100002;
1624
public static int n, limitl, limitw;
1725

1826
public static int[] head = new int[MAXN];
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
package class183;
2+
3+
// 相近点对的数量,C++版
4+
// 一共有n个节点,所有节点组成一棵树,1号节点是树头
5+
// 从2号点开始,给定每个点的父节点编号、与父节点之间无向边的边权
6+
// 给定两个整数limitl、limitw,如下为(a, b)是相近点对的定义
7+
// 首先a < b,其次两者简单路径的边数不超过limitl、权值和不超过limitw
8+
// 打印树上有多少相近点对
9+
// 1 <= limitl <= n <= 10^5
10+
// 0 <= limitw <= 10^9
11+
// 0 <= 边权 <= 10^4
12+
// 测试链接 : https://www.luogu.com.cn/problem/CF293E
13+
// 测试链接 : https://codeforces.com/problemset/problem/293/E
14+
// 如下实现是C++的版本,C++版本和java版本逻辑完全一样
15+
// 提交如下代码,可以通过所有测试用例
16+
17+
//#include <bits/stdc++.h>
18+
//
19+
//using namespace std;
20+
//
21+
//struct Node {
22+
// int dis, dep;
23+
//};
24+
//
25+
//bool NodeCmp(Node a, Node b) {
26+
// return a.dis < b.dis;
27+
//}
28+
//
29+
//const int MAXN = 100002;
30+
//int n, limitl, limitw;
31+
//
32+
//int head[MAXN];
33+
//int nxt[MAXN << 1];
34+
//int to[MAXN << 1];
35+
//int weight[MAXN << 1];
36+
//int cntg;
37+
//
38+
//bool vis[MAXN];
39+
//int siz[MAXN];
40+
//int maxPart[MAXN];
41+
//int total;
42+
//int centroid;
43+
//
44+
//Node arr[MAXN];
45+
//int cnta;
46+
//
47+
//int tree[MAXN];
48+
//
49+
//void addEdge(int u, int v, int w) {
50+
// nxt[++cntg] = head[u];
51+
// to[cntg] = v;
52+
// weight[cntg] = w;
53+
// head[u] = cntg;
54+
//}
55+
//
56+
//int lowbit(int i) {
57+
// return i & -i;
58+
//}
59+
//
60+
//void add(int i, int v) {
61+
// while (i <= limitl + 1) {
62+
// tree[i] += v;
63+
// i += lowbit(i);
64+
// }
65+
//}
66+
//
67+
//int sum(int i) {
68+
// int ret = 0;
69+
// while (i > 0) {
70+
// ret += tree[i];
71+
// i -= lowbit(i);
72+
// }
73+
// return ret;
74+
//}
75+
//
76+
//void getCentroid(int u, int fa) {
77+
// siz[u] = 1;
78+
// maxPart[u] = 0;
79+
// for (int e = head[u]; e; e = nxt[e]) {
80+
// int v = to[e];
81+
// if (v != fa && !vis[v]) {
82+
// getCentroid(v, u);
83+
// siz[u] += siz[v];
84+
// maxPart[u] = max(maxPart[u], siz[v]);
85+
// }
86+
// }
87+
// maxPart[u] = max(maxPart[u], total - siz[u]);
88+
// if (centroid == 0 || maxPart[u] < maxPart[centroid]) {
89+
// centroid = u;
90+
// }
91+
//}
92+
//
93+
//void dfs(int u, int fa, int dis, int dep) {
94+
// if (dis > limitw || dep > limitl + 1) {
95+
// return;
96+
// }
97+
// arr[++cnta] = { dis, dep };
98+
// for (int e = head[u]; e; e = nxt[e]) {
99+
// int v = to[e];
100+
// if (v != fa && !vis[v]) {
101+
// dfs(v, u, dis + weight[e], dep + 1);
102+
// }
103+
// }
104+
//}
105+
//
106+
//long long calc(int u, int dis, int dep) {
107+
// cnta = 0;
108+
// dfs(u, 0, dis, dep);
109+
// sort(arr + 1, arr + cnta + 1, NodeCmp);
110+
// for (int i = 1; i <= cnta; i++) {
111+
// add(arr[i].dep, 1);
112+
// }
113+
// long long ret = 0;
114+
// for (int l = 1, r = cnta; l <= r; ) {
115+
// if (arr[l].dis + arr[r].dis <= limitw) {
116+
// add(arr[l].dep, -1);
117+
// ret += sum(limitl - arr[l].dep + 2);
118+
// l++;
119+
// } else {
120+
// add(arr[r].dep, -1);
121+
// r--;
122+
// }
123+
// }
124+
// return ret;
125+
//}
126+
//
127+
//long long solve(int u) {
128+
// vis[u] = true;
129+
// long long ans = calc(u, 0, 1);
130+
// for (int e = head[u]; e; e = nxt[e]) {
131+
// int v = to[e];
132+
// if (!vis[v]) {
133+
// ans -= calc(v, weight[e], 2);
134+
// total = siz[v];
135+
// centroid = 0;
136+
// getCentroid(v, 0);
137+
// ans += solve(centroid);
138+
// }
139+
// }
140+
// return ans;
141+
//}
142+
//
143+
//int main() {
144+
// ios::sync_with_stdio(false);
145+
// cin.tie(nullptr);
146+
// cin >> n >> limitl >> limitw;
147+
// for (int i = 2, fa, w; i <= n; i++) {
148+
// cin >> fa >> w;
149+
// addEdge(i, fa, w);
150+
// addEdge(fa, i, w);
151+
// }
152+
// total = n;
153+
// centroid = 0;
154+
// getCentroid(1, 0);
155+
// cout << solve(centroid) << '\n';
156+
// return 0;
157+
//}

0 commit comments

Comments
 (0)