Skip to content

Commit f221129

Browse files
committed
modify code
1 parent 2c090e1 commit f221129

File tree

4 files changed

+301
-10
lines changed

4 files changed

+301
-10
lines changed

src/class165/Code02_UndoUnionFind1.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class Code02_UndoUnionFind1 {
2626
public static int[] siz = new int[MAXN];
2727
public static int[] edgeCnt = new int[MAXN];
2828

29-
public static int[][] opstack = new int[MAXN][2];
29+
public static int[][] rollback = new int[MAXN][2];
3030
public static int opsize = 0;
3131

3232
public static int[] ans = new int[MAXN];
@@ -56,13 +56,13 @@ public static void merge(int x, int y) {
5656
father[fy] = fx;
5757
siz[fx] += siz[fy];
5858
edgeCnt[fx] += edgeCnt[fy] + 1;
59-
opstack[++opsize][0] = fx;
60-
opstack[opsize][1] = fy;
59+
rollback[++opsize][0] = fx;
60+
rollback[opsize][1] = fy;
6161
}
6262

6363
public static void undo() {
64-
int fx = opstack[opsize][0];
65-
int fy = opstack[opsize--][1];
64+
int fx = rollback[opsize][0];
65+
int fy = rollback[opsize--][1];
6666
father[fy] = fy;
6767
siz[fx] -= siz[fy];
6868
edgeCnt[fx] -= edgeCnt[fy] + 1;

src/class165/Code02_UndoUnionFind2.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
//int siz[MAXN];
2323
//int edgeCnt[MAXN];
2424
//
25-
//int opstack[MAXN][2];
25+
//int rollback[MAXN][2];
2626
//int opsize = 0;
2727
//
2828
//int ans[MAXN];
@@ -52,13 +52,13 @@
5252
// father[fy] = fx;
5353
// siz[fx] += siz[fy];
5454
// edgeCnt[fx] += edgeCnt[fy] + 1;
55-
// opstack[++opsize][0] = fx;
56-
// opstack[opsize][1] = fy;
55+
// rollback[++opsize][0] = fx;
56+
// rollback[opsize][1] = fy;
5757
//}
5858
//
5959
//void undo() {
60-
// int fx = opstack[opsize][0];
61-
// int fy = opstack[opsize--][1];
60+
// int fx = rollback[opsize][0];
61+
// int fy = rollback[opsize--][1];
6262
// father[fy] = fy;
6363
// siz[fx] -= siz[fy];
6464
// edgeCnt[fx] -= edgeCnt[fy] + 1;

src/class165/Code03_Envy1.java

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
package class165;
2+
3+
// k条边同在最小生成树里,java版
4+
// 测试链接 : https://www.luogu.com.cn/problem/CF891C
5+
// 测试链接 : https://codeforces.com/problemset/problem/891/C
6+
// 提交以下的code,提交时请把类名改成"Main",可以通过所有测试用例
7+
8+
import java.io.BufferedReader;
9+
import java.io.IOException;
10+
import java.io.InputStreamReader;
11+
import java.io.OutputStreamWriter;
12+
import java.io.PrintWriter;
13+
import java.io.StreamTokenizer;
14+
import java.util.Arrays;
15+
16+
public class Code03_Envy1 {
17+
18+
public static int MAXN = 500001;
19+
public static int n, m, q, k;
20+
21+
// 节点u、节点v、边权w
22+
public static int[][] edge = new int[MAXN][3];
23+
24+
// 节点u、节点v、边权w、问题编号i
25+
public static int[][] queryEdge = new int[MAXN][4];
26+
27+
// 可撤销并查集
28+
public static int[] father = new int[MAXN];
29+
public static int[] siz = new int[MAXN];
30+
public static int[][] rollback = new int[MAXN << 1][2];
31+
public static int opsize;
32+
33+
// 答案数组
34+
public static boolean[] ans = new boolean[MAXN];
35+
36+
public static int find(int i) {
37+
while (i != father[i]) {
38+
i = father[i];
39+
}
40+
return i;
41+
}
42+
43+
public static boolean merge(int x, int y) {
44+
int fx = find(x);
45+
int fy = find(y);
46+
if (fx == fy) {
47+
rollback[++opsize][0] = 0;
48+
return false;
49+
}
50+
if (siz[fx] < siz[fy]) {
51+
int tmp = fx;
52+
fx = fy;
53+
fy = tmp;
54+
}
55+
father[fy] = fx;
56+
siz[fx] += siz[fy];
57+
rollback[++opsize][0] = fx;
58+
rollback[opsize][1] = fy;
59+
return true;
60+
}
61+
62+
public static void undo() {
63+
if (rollback[opsize][0] == 0) {
64+
opsize--;
65+
} else {
66+
int fx = rollback[opsize][0];
67+
int fy = rollback[opsize--][1];
68+
father[fy] = fy;
69+
siz[fx] -= siz[fy];
70+
}
71+
}
72+
73+
public static void prepare() {
74+
for (int i = 1; i <= n; i++) {
75+
father[i] = i;
76+
siz[i] = 1;
77+
}
78+
Arrays.sort(edge, 1, m + 1, (a, b) -> a[2] - b[2]);
79+
Arrays.sort(queryEdge, 1, k + 1, (a, b) -> a[2] != b[2] ? (a[2] - b[2]) : (a[3] - b[3]));
80+
Arrays.fill(ans, 1, q + 1, true);
81+
}
82+
83+
public static void compute() {
84+
int ei = 1;
85+
for (int l = 1, r = 1; l <= k; l = ++r) {
86+
for (; ei <= m && edge[ei][2] < queryEdge[l][2]; ei++) {
87+
merge(edge[ei][0], edge[ei][1]);
88+
}
89+
while (r + 1 <= k && queryEdge[l][2] == queryEdge[r + 1][2] && queryEdge[l][3] == queryEdge[r + 1][3]) {
90+
r++;
91+
}
92+
for (int i = l; i <= r; i++) {
93+
if (!merge(queryEdge[i][0], queryEdge[i][1])) {
94+
ans[queryEdge[i][3]] = false;
95+
}
96+
}
97+
for (int i = l; i <= r; i++) {
98+
undo();
99+
}
100+
}
101+
}
102+
103+
public static void main(String[] args) throws IOException {
104+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
105+
StreamTokenizer in = new StreamTokenizer(br);
106+
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
107+
in.nextToken();
108+
n = (int) in.nval;
109+
in.nextToken();
110+
m = (int) in.nval;
111+
for (int i = 1; i <= m; i++) {
112+
in.nextToken();
113+
edge[i][0] = (int) in.nval;
114+
in.nextToken();
115+
edge[i][1] = (int) in.nval;
116+
in.nextToken();
117+
edge[i][2] = (int) in.nval;
118+
}
119+
in.nextToken();
120+
q = (int) in.nval;
121+
k = 0;
122+
for (int i = 1, s; i <= q; i++) {
123+
in.nextToken();
124+
s = (int) in.nval;
125+
for (int j = 1, ei; j <= s; j++) {
126+
in.nextToken();
127+
ei = (int) in.nval;
128+
queryEdge[++k][0] = edge[ei][0];
129+
queryEdge[k][1] = edge[ei][1];
130+
queryEdge[k][2] = edge[ei][2];
131+
queryEdge[k][3] = i;
132+
}
133+
}
134+
prepare();
135+
compute();
136+
for (int i = 1; i <= q; i++) {
137+
if (ans[i]) {
138+
out.println("YES");
139+
} else {
140+
out.println("NO");
141+
}
142+
}
143+
out.flush();
144+
out.close();
145+
br.close();
146+
}
147+
148+
}

src/class165/Code03_Envy2.java

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
package class165;
2+
3+
// k条边同在最小生成树里,C++版
4+
// 测试链接 : https://www.luogu.com.cn/problem/CF891C
5+
// 测试链接 : https://codeforces.com/problemset/problem/891/C
6+
// 如下实现是C++的版本,C++版本和java版本逻辑完全一样
7+
// 提交如下代码,可以通过所有测试用例
8+
9+
//#include <bits/stdc++.h>
10+
//
11+
//using namespace std;
12+
//
13+
//struct Edge {
14+
// int u, v, w;
15+
//};
16+
//
17+
//bool EdgeCmp(Edge x, Edge y) {
18+
// return x.w < y.w;
19+
//}
20+
//
21+
//struct QueryEdge {
22+
// int u, v, w, i;
23+
//};
24+
//
25+
//bool QueryEdgeCmp(QueryEdge x, QueryEdge y) {
26+
// if(x.w != y.w) {
27+
// return x.w < y.w;
28+
// } else {
29+
// return x.i < y.i;
30+
// }
31+
//}
32+
//
33+
//const int MAXN = 500001;
34+
//int n, m, q, k;
35+
//Edge edge[MAXN];
36+
//QueryEdge queryEdge[MAXN];
37+
//
38+
//int father[MAXN];
39+
//int siz[MAXN];
40+
//int rollback[MAXN << 1][2];
41+
//int opsize;
42+
//
43+
//bool ans[MAXN];
44+
//
45+
//int find(int i) {
46+
// while (i != father[i]) {
47+
// i = father[i];
48+
// }
49+
// return i;
50+
//}
51+
//
52+
//bool merge(int x, int y) {
53+
// int fx = find(x);
54+
// int fy = find(y);
55+
// if (fx == fy) {
56+
// rollback[++opsize][0] = 0;
57+
// return false;
58+
// }
59+
// if (siz[fx] < siz[fy]) {
60+
// int tmp = fx;
61+
// fx = fy;
62+
// fy = tmp;
63+
// }
64+
// father[fy] = fx;
65+
// siz[fx] += siz[fy];
66+
// rollback[++opsize][0] = fx;
67+
// rollback[opsize][1] = fy;
68+
// return true;
69+
//}
70+
//
71+
//void undo() {
72+
// if (rollback[opsize][0] == 0) {
73+
// opsize--;
74+
// } else {
75+
// int fx = rollback[opsize][0];
76+
// int fy = rollback[opsize--][1];
77+
// father[fy] = fy;
78+
// siz[fx] -= siz[fy];
79+
// }
80+
//}
81+
//
82+
//void prepare() {
83+
// for (int i = 1; i <= n; i++) {
84+
// father[i] = i;
85+
// siz[i] = 1;
86+
// }
87+
// sort(edge + 1, edge + m + 1, EdgeCmp);
88+
// sort(queryEdge + 1, queryEdge + k + 1, QueryEdgeCmp);
89+
// for (int i = 1; i <= q; i++) {
90+
// ans[i] = true;
91+
// }
92+
//}
93+
//
94+
//void compute() {
95+
// int ei = 1;
96+
// for (int l = 1, r = 1; l <= k; l = ++r) {
97+
// for (; ei <= m && edge[ei].w < queryEdge[l].w; ei++) {
98+
// merge(edge[ei].u, edge[ei].v);
99+
// }
100+
// while (r + 1 <= k && queryEdge[l].w == queryEdge[r + 1].w && queryEdge[l].i == queryEdge[r + 1].i) {
101+
// r++;
102+
// }
103+
// for (int i = l; i <= r; i++) {
104+
// if (!merge(queryEdge[i].u, queryEdge[i].v)) {
105+
// ans[queryEdge[i].i] = false;
106+
// }
107+
// }
108+
// for (int i = l; i <= r; i++) {
109+
// undo();
110+
// }
111+
// }
112+
//}
113+
//
114+
//int main() {
115+
// ios::sync_with_stdio(false);
116+
// cin.tie(nullptr);
117+
// cin >> n >> m;
118+
// for (int i = 1; i <= m; i++) {
119+
// cin >> edge[i].u >> edge[i].v >> edge[i].w;
120+
// }
121+
// cin >> q;
122+
// k = 0;
123+
// for (int i = 1, s; i <= q; i++) {
124+
// cin >> s;
125+
// for (int j = 1, ei; j <= s; j++) {
126+
// cin >> ei;
127+
// queryEdge[++k].u = edge[ei].u;
128+
// queryEdge[k].v = edge[ei].v;
129+
// queryEdge[k].w = edge[ei].w;
130+
// queryEdge[k].i = i;
131+
// }
132+
// }
133+
// prepare();
134+
// compute();
135+
// for (int i = 1; i <= q; i++) {
136+
// if (ans[i]) {
137+
// cout << "YES" << "\n";
138+
// } else {
139+
// cout << "NO" << "\n";
140+
// }
141+
// }
142+
// return 0;
143+
//}

0 commit comments

Comments
 (0)