-
Notifications
You must be signed in to change notification settings - Fork 15
/
commutable-islands_solve.cpp
83 lines (71 loc) · 2.57 KB
/
commutable-islands_solve.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
vector<pair<int, int>> disjoint_set_initialize(int size) {
vector<pair<int, int>> parents(size);
for (int i = 0; i < size; i++) {
parents[i] = {i, 1};
}
return parents;
}
int disjoint_set_get_root(vector<pair<int, int>> &parents, int element) {
int cur_element = element;
while (parents[cur_element].first != cur_element) {
parents[cur_element].first = parents[parents[cur_element].first].first;
cur_element = parents[cur_element].first;
}
return cur_element;
}
bool disjoint_set_find(vector<pair<int, int>> &parents, int element1,
int element2) {
int root1 = disjoint_set_get_root(parents, element1);
int root2 = disjoint_set_get_root(parents, element2);
if (root1 == root2) {
return true;
}
return false;
}
void disjoint_set_union(vector<pair<int, int>> &parents, int element1,
int element2) {
int root1 = disjoint_set_get_root(parents, element1);
int root2 = disjoint_set_get_root(parents, element2);
int set1_size = parents[root1].second;
int set2_size = parents[root2].second;
if (set1_size < set2_size) {
parents[root1].first = parents[root2].first;
parents[root2].second += parents[root1].second;
parents[root1].second = 0;
} else {
parents[root2].first = parents[root1].first;
parents[root1].second += parents[root2].second;
parents[root2].second = 0;
}
}
int mst_cost_kruskal(const vector<pair<int, pair<int, int>>> weights,
vector<pair<int, int>> &parents) {
int edges = weights.size();
int min_cost = 0;
for (int i = 0; i < edges; i++) {
int edge_from = weights[i].second.first;
int edge_to = weights[i].second.second;
int cost = weights[i].first;
if (!disjoint_set_find(parents, edge_from, edge_to)) {
min_cost += cost;
disjoint_set_union(parents, edge_from, edge_to);
}
}
return min_cost;
}
int Solution::solve(int A, vector<vector<int> > &B) {
int node_count = A;
const vector<vector<int>> &bridges = B;
auto parents = disjoint_set_initialize(node_count + 1);
vector<pair<int, pair<int, int>>> weights;
int edge_count = bridges.size();
for (int i = 0; i < edge_count; i++) {
int edge_from = bridges[i][0];
int edge_to = bridges[i][1];
int weight = bridges[i][2];
weights.push_back({weight, {edge_from, edge_to}});
}
sort(weights.begin(), weights.end());
int min_cost = mst_cost_kruskal(weights, parents);
return min_cost;
}