File tree 7 files changed +96
-4
lines changed
7 files changed +96
-4
lines changed Original file line number Diff line number Diff line change
1
+ 并查集 Disjoint-set
2
+ - 每个集合用一棵树来表示, 树根的编号就是整个集合的编号
3
+ - 每个结点存储其父结点 p[ x]
4
+ - 判断树根: p[ x] == x
5
+ - 求x的集合编号: find(x): while(p[ x] != x) x = p[ x] ; return x;
6
+ - 合并两个集合: p[ find(x)] = find(y)
7
+ - 优化: 路径压缩, O(n) -> O(1)
Original file line number Diff line number Diff line change
1
+ /*
2
+ 836. 合并集合
3
+ https://www.acwing.com/problem/content/838/
4
+
5
+ https://blog.csdn.net/raelum/article/details/128766206
6
+
7
+ n 个数, 1 ~ n
8
+ m 个操作:
9
+ M a b: merge set(a) and set(b)
10
+ Q a b: query set(a) == set(b), Yes/No
11
+ n, m <= 1e5
12
+ 并查集模板
13
+ */
14
+ #include < bits/stdc++.h>
15
+ using namespace std ;
16
+
17
+ const int N = 1e5 + 10 ;
18
+
19
+ int n, m;
20
+ int p[N];
21
+
22
+ int find (int x) {
23
+ if (p[x] != x) {
24
+ p[x] = find (p[x]);
25
+ }
26
+ return p[x];
27
+ }
28
+
29
+ int main () {
30
+ cin >> n >> m;
31
+ for (int i = 1 ; i <= n; i++) {
32
+ p[i] = i;
33
+ }
34
+ while (m--) {
35
+ char ch;
36
+ int a, b;
37
+ cin >> ch >> a >> b;
38
+ if (ch == ' M' ) {
39
+ p[find (a)] = find (b);
40
+ } else if (ch == ' Q' ) {
41
+ if (find (a) == find (b)) {
42
+ cout << " Yes" << endl;
43
+ } else {
44
+ cout << " No" << endl;
45
+ }
46
+ }
47
+ }
48
+ }
49
+ /*
50
+ 输入样例:
51
+ 4 5
52
+ M 1 2
53
+ M 3 4
54
+ Q 1 2
55
+ Q 1 3
56
+ Q 3 4
57
+ 输出样例:
58
+ Yes
59
+ No
60
+ Yes
61
+ */
Original file line number Diff line number Diff line change 8
8
9
9
- [ Graph Storage] ( https://blog.csdn.net/raelum/article/details/129108365 )
10
10
11
- - [ algorithm] ( https://niyunsheng.gitbook.io/algorithm )
11
+ - [ algorithm] ( https://niyunsheng.gitbook.io/algorithm )
12
+
13
+ - [ 代码随想录] ( https://programmercarl.com/ )
Original file line number Diff line number Diff line change @@ -5,6 +5,8 @@ AcWing 861. 二分图的最大匹配
5
5
https://www.acwing.com/solution/content/5334/
6
6
7
7
有点贪心的意味
8
+ 匈牙利算法准则:待字闺中,据为己有;名花有主,求他放手。
9
+ 一定要坚持不懈,就算前面有一个困难,也不要直接退缩,直接退缩是完全没有希望的. -- yxc
8
10
9
11
导读:什么是最大匹配?
10
12
要了解匈牙利算法必须先理解下面的概念:
Original file line number Diff line number Diff line change 47
47
作者:郡呈
48
48
链接:https://www.acwing.com/solution/content/6976/
49
49
来源:AcWing
50
- 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
50
+ 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
51
+
52
+
53
+ ## 最小生成树
54
+
55
+ - Prime
56
+ - 朴素版: 稠密图, O(n^2)
57
+ - 堆优化: 稀疏图, O(m logn)
58
+ - Kruskal, O(m logm)
59
+
60
+ 算法选择:
61
+ - 稠密图: 朴素版Prime
62
+ - 稀疏图: Kruskal, 比堆优化版 Prime 更清晰
63
+
64
+ ## 二分图
65
+
66
+ - 判别: 染色法, 深度优先 O(n + m)
67
+ - 求最大匹配: 匈牙利算法 O(mn), 实际运行时间远小于 O(mn)
Original file line number Diff line number Diff line change @@ -33,7 +33,8 @@ vector<int> res;
33
33
bool topSort () {
34
34
queue<int > q;
35
35
for (int i = 1 ; i <= n; i++) {
36
- if (in[i] == 0 ) q.push (i);
36
+ if (in[i] == 0 )
37
+ q.push (i);
37
38
}
38
39
while (q.size ()) {
39
40
auto cur = q.front ();
@@ -42,7 +43,8 @@ bool topSort() {
42
43
for (int edge = h[cur]; edge != -1 ; edge = ne[edge]) {
43
44
auto end = e[edge];
44
45
in[end]--;
45
- if (in[end] == 0 ) q.push (end);
46
+ if (in[end] == 0 )
47
+ q.push (end);
46
48
}
47
49
}
48
50
return res.size () == n;
Original file line number Diff line number Diff line change
1
+ 一定要坚持不懈,就算前面有一个困难,也不要直接退缩,直接退缩是完全没有希望的. -- yxc
You can’t perform that action at this time.
0 commit comments