15
iota(parent_.begin(), parent_.end(), 0);16
fill(rank_.begin(), rank_.end(), 1);19
return parent_[u] == u ? u : parent_[u] = find(parent_[u]);21
bool join(int u, int v) {29
if (rank_[u] < rank_[v]) {45
vector<int> edges_idx_;46
int kruskal(const int n, const int removed_edge_idx, const int init_edge_idx,47
const vector<vector<int>> &edges) {49
int edges_size = edges.size();52
if (init_edge_idx != -1) {53
graph.join(edges[init_edge_idx][0], edges[init_edge_idx][1]);54
total += edges[init_edge_idx][2];57
for (int i = 0; i < edges_size; ++i) {58
int edge_idx = edges_idx_[i];60
if (edge_idx == removed_edge_idx) {64
int u = edges[edge_idx][0];65
int v = edges[edge_idx][1];67
if (graph.join(u, v)) {68
total += edges[edge_idx][2];72
return graph.united() ? total : INT_MAX;74
vector<vector<int>> findCriticalAndPseudoCriticalEdges(int n, vector<vector<int>> &edges) {75
int edges_size = edges.size();77
edges_idx_.resize(edges_size);79
iota(edges_idx_.begin(), edges_idx_.end(), 0);81
sort(edges_idx_.begin(), edges_idx_.end(),82
[&edges](int a, int b) { return edges[a][2] < edges[b][2]; });84
int mst = kruskal(n, -1, -1, edges);89
for (int i = 0; i < edges_size; ++i) {90
int edge_idx = edges_idx_[i];91
int total = kruskal(n, -1, edge_idx, edges);94
total = kruskal(n, edge_idx, -1, edges);96
critical.push_back(edge_idx);98
psudo.push_back(edge_idx);103
return {critical, psudo};