Skip to content

Commit 897ad74

Browse files
committed
[Misc]
1 parent bccc8b0 commit 897ad74

File tree

7 files changed

+96
-4
lines changed

7 files changed

+96
-4
lines changed

DSA/Notes.md

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
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)

DSA/UnionFind/AW836_UnionSets.cpp

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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+
*/

Docs/Resources.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,6 @@
88

99
- [Graph Storage](https://blog.csdn.net/raelum/article/details/129108365)
1010

11-
- [algorithm](https://niyunsheng.gitbook.io/algorithm)
11+
- [algorithm](https://niyunsheng.gitbook.io/algorithm)
12+
13+
- [代码随想录](https://programmercarl.com/)

Graph/BiPartGraph/AW861_Hungarian.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ AcWing 861. 二分图的最大匹配
55
https://www.acwing.com/solution/content/5334/
66
77
有点贪心的意味
8+
匈牙利算法准则:待字闺中,据为己有;名花有主,求他放手。
9+
一定要坚持不懈,就算前面有一个困难,也不要直接退缩,直接退缩是完全没有希望的. -- yxc
810
911
导读:什么是最大匹配?
1012
要了解匈牙利算法必须先理解下面的概念:

Graph/Notes.md

+18-1
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,21 @@
4747
作者:郡呈
4848
链接:https://www.acwing.com/solution/content/6976/
4949
来源: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)

Graph/TopoSort/AW848_TopoSort.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ vector<int> res;
3333
bool topSort() {
3434
queue<int> q;
3535
for(int i = 1; i <= n; i++) {
36-
if(in[i] == 0) q.push(i);
36+
if(in[i] == 0)
37+
q.push(i);
3738
}
3839
while(q.size()) {
3940
auto cur = q.front();
@@ -42,7 +43,8 @@ bool topSort() {
4243
for(int edge = h[cur]; edge != -1; edge = ne[edge]) {
4344
auto end = e[edge];
4445
in[end]--;
45-
if(in[end] == 0) q.push(end);
46+
if(in[end] == 0)
47+
q.push(end);
4648
}
4749
}
4850
return res.size() == n;

README

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
一定要坚持不懈,就算前面有一个困难,也不要直接退缩,直接退缩是完全没有希望的. -- yxc

0 commit comments

Comments
 (0)