Skip to content

Commit d646e0b

Browse files
Add Pseudocode
1 parent 2108eb6 commit d646e0b

File tree

5 files changed

+214
-1
lines changed

5 files changed

+214
-1
lines changed

Pseudocode/Graph/12-June-2025/segment-tree.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ int rmq(p, L, R, i, j) {
3434
if (i > R || j < L) {
3535
return -1
3636
}
37-
if (L >= i && R >= j) {
37+
if (L >= i && R <= j) {
3838
return st[p]
3939
}
4040

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
class SegmentTree {
2+
SegmentTree(vector<int> nums)
3+
int rmq(i, j)
4+
5+
int left(p) { return p << 1 }
6+
int right(p) { return (p << 1) + 1 }
7+
void build(p, L, R)
8+
int rmq(p, L, R, i, j)
9+
10+
int n
11+
vector<int> nums, st
12+
}
13+
14+
SegmentTree(vector<int> nums) : nums(nums), n(nums.size()) {
15+
st.resize(n)
16+
build(1, 0, n - 1)
17+
}
18+
19+
void build(p, L, R) {
20+
if (L == R) {
21+
st[p] = L
22+
} else {
23+
build(left(p), L, (L + R) / 2)
24+
build(right(p), (L + R) / 2 + 1, R)
25+
26+
p1 = st[left(p)]
27+
p2 = st[right(p)]
28+
29+
st[p] = (nums[p1] <= nums[p2]) ? p1 : p2
30+
}
31+
}
32+
33+
int rmq(p, L, R, i, j) {
34+
if (i > R || j < L) {
35+
return -1
36+
}
37+
38+
if (L >= i && R <= j) {
39+
return st[p]
40+
}
41+
42+
p1 = rmq(left(p), L, (L + R) / 2, i, j)
43+
p2 = rmq(right(p), (L + R) / 2 + 1, R, i, j)
44+
45+
if (p1 == -1) {
46+
return p2
47+
}
48+
if (p2 == -1) {
49+
return p1
50+
}
51+
52+
return (nums[p1] < nums[p2]) ? p1 : p2
53+
}
54+
55+
int rmq(i, j) {
56+
return rmq(1, 0, n - 1, i, j)
57+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using Node = int
2+
using Weight = int
3+
using AdjList = unordered_map<Node, vector<pair<Node, Weight>>>
4+
5+
Node src, dst
6+
AdjList adj_list
7+
unordered_map<Node, Weight> min_dist
8+
9+
// Init all Node to inf
10+
11+
priority_queue<pair<Weight, Node>, vector<pair<Weight, Node>>, greater<>> order
12+
13+
min_dist[src] = 0
14+
order.emplace(0, src)
15+
16+
while (!order.empty()) {
17+
[du, u] = order.top()
18+
order.pop()
19+
20+
if (du > min_dist[u]) {
21+
continue
22+
}
23+
24+
for ([v, dv] : adj_list[u]) {
25+
if (min_dist[u] + dv < min_dist[v]) {
26+
min_dist[v] = min_dist[u] + dv
27+
order.emplace(min_dist[v], v)
28+
}
29+
}
30+
}
31+
32+
return min_dist[dst]
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
class UFDS {
2+
public:
3+
UFDS(int num_v)
4+
int FindParent(u)
5+
bool IsSameSet(u, v)
6+
void Union(u, v)
7+
8+
private:
9+
int num_v
10+
vector<int> parent
11+
vector<int> rank
12+
}
13+
14+
UFDS(int num_v) : num_v(num_v) {
15+
parent.resize(num_v)
16+
rank.resize(num_v)
17+
iota(parent.begin(), parent.end(), 0)
18+
}
19+
20+
int FindParent(u) {
21+
if (parent[u] == u) {
22+
return u
23+
}
24+
25+
return parent[u] = u
26+
}
27+
28+
bool IsSameSet(u, v) {
29+
return FindParent(u) == FindParent(v)
30+
}
31+
32+
void Union(u, v) {
33+
if (!IsSameSet(u, v)) {
34+
pu = FindParent(u)
35+
pv = FindParent(v)
36+
37+
if (rank[pu] > rank[pv]) {
38+
parent[v] = pu
39+
} else {
40+
parent[u] = pv
41+
if (rank[pu] == rank[pv]) {
42+
++rank[pv]
43+
}
44+
}
45+
}
46+
}
47+
48+
using Node = int
49+
using Weight = int
50+
using Edge = pair<Node, Node>
51+
52+
vector<pair<Weight, Edge>> edge_list
53+
UFDS ufds(num_v)
54+
55+
ranges::sort(edge_list)
56+
57+
cost = 0
58+
for ([w, edge] : edge_list) {
59+
[u, v] = edge
60+
if (!ufds.IsSameSet(u, v)) {
61+
ufds.Union(u, v)
62+
cost += w
63+
}
64+
}
65+
66+
return cost
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
class SegmentTree {
2+
public:
3+
SegmentTree(vector<int> nums)
4+
int rmq(i, j)
5+
6+
private:
7+
int left(p) { return p << 1 }
8+
int right(p) { return (p << 1) + 1 }
9+
void build(p, L, R)
10+
int rmq(p, L, R, i, j)
11+
12+
int n
13+
vector<int> nums
14+
vector<int> st
15+
}
16+
17+
SegmentTree(vector<int> nums) : nums(nums), n(nums.size()) {
18+
st.resize(n)
19+
build(1, 0, n - 1)
20+
}
21+
22+
void build(p, L, R) {
23+
if (L == R) {
24+
st[p] = L
25+
} else {
26+
build(left(p), L, (L + R) / 2)
27+
build(right(p), (L + R) / 2 + 1, R)
28+
29+
p1 = st[left(p)]
30+
p2 = st[right(p)]
31+
st[p] = nums[p1] <= nums[p2] ? p1 : p2
32+
}
33+
}
34+
35+
int rmq(p, L, R, i, j) {
36+
if (i > R || j < L) {
37+
return -1
38+
}
39+
if (L >= i && R <= j) {
40+
return st[p]
41+
}
42+
43+
p1 = rmq(left(p), L, (L + R) / 2, i, j)
44+
p2 = rmq(right(p), (L + R) / 2 + 1, R, i, j)
45+
46+
if (p1 == -1) {
47+
return p2
48+
}
49+
if (p2 == -1) {
50+
return p1
51+
}
52+
53+
return nums[p1] <= nums[p2] ? p1 : p2
54+
}
55+
56+
int rmq(i, j) {
57+
return rmq(1, 0, n - 1, i, j)
58+
}

0 commit comments

Comments
 (0)