Skip to content

Commit 2108eb6

Browse files
Add Pseudocode
1 parent 49fdfc0 commit 2108eb6

3 files changed

Lines changed: 109 additions & 0 deletions

File tree

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

0 commit comments

Comments
 (0)