Skip to content

Commit 15abed9

Browse files
Add Pseudocode
1 parent ad262ab commit 15abed9

3 files changed

Lines changed: 110 additions & 0 deletions

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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+
priority_queue<pair<Weight, Node>, vector<pair<Weight, Node>>, greater<pair<Weight, Node>>> order
9+
10+
for ([u, _] : adj_list) {
11+
min_dist[u] = inf
12+
}
13+
14+
min_dist[src] = 0
15+
order.emplace(0, src)
16+
17+
while(!order.empty()) {
18+
[du, u] = order.top()
19+
order.pop()
20+
21+
if (du > min_dist[u]) {
22+
continue
23+
}
24+
25+
for ([dv, v] : adj_list[u]) {
26+
if (min_dist[u] + dv < min_dist[v]) {
27+
min_dist[v] = min_dist[u] + dv
28+
order.emplace(min_dist[v], v)
29+
}
30+
}
31+
}
32+
33+
return min_dist[dst]
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using Node = int
2+
using Weight = int
3+
using Edge = pair<int, int>
4+
5+
num_v
6+
vector<pair<Weight, Edge>> edge_list
7+
UFDS ufds(num_v)
8+
9+
// Forgot this crucial step
10+
ranges::sort(edge_list)
11+
12+
cost = 0
13+
for ([w, uv] : edge_list) {
14+
[u, v] = uv
15+
if (!ufds.IsSameSet(u, v)) {
16+
ufds.Union(u, v)
17+
cost += w
18+
}
19+
}
20+
21+
return cost
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
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+
size_t 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+
32+
st[p] = nums[p1] < nums[p2] ? p1 : p2
33+
}
34+
}
35+
36+
int rmq(p, L, R, i, j) {
37+
if (i > R || j < L) {
38+
return -1
39+
}
40+
41+
if (L >= i && j <= R) {
42+
return st[p]
43+
}
44+
45+
p1 = rmq(left(p), L, (L + R) / 2, i, j)
46+
p2 = rmq(right(p), (L + R) / 2 + 1, R, i, j)
47+
48+
if (p1 == -1) {
49+
return p2
50+
}
51+
if (p2 == -1) {
52+
return p1
53+
}
54+
55+
return nums[p1] < nums[p2] ? p1 : p2
56+
}

0 commit comments

Comments
 (0)