#include <bits/stdc++.h>
int Query(int u, int v, int w);
void Bridge(int u, int v);
void Solve(int N) {
std::vector<std::set<int>> adj(N);
auto add_edge = [&](int u, int v) {
if (u != v) {
adj[u].insert(v);
}
};
std::vector q_lca(N, std::vector<int>(N));
for (int i = 1; i < N; ++i) {
for (int j = i + 1; j < N; ++j) {
int lca = Query(0, i, j);
add_edge(lca, i);
add_edge(lca, j);
q_lca[i][j] = q_lca[j][i] = lca;
}
}
std::vector<int> topsort;
std::vector<bool> vis(N);
std::function<void(int)> dfs;
dfs = [&](int node) {
if (vis[node]) {
return;
}
vis[node] = true;
for (auto &i : adj[node]) {
dfs(i);
}
topsort.push_back(node);
};
for (int i = 1; i < N; ++i) {
dfs(i);
}
if (std::find(topsort.begin(), topsort.end(), 0) == topsort.end()) {
topsort.push_back(0);
}
std::reverse(topsort.begin(), topsort.end());
std::vector<int> pos(N);
for (int i = 0; i < N; ++i) {
pos[topsort[i]] = i;
}
for (int i = 1; i < N; ++i) {
int par = 0;
for (int j = 0; j < N; ++j) {
if (i == j) {
continue;
}
if (q_lca[i][j] == j and pos[j] > pos[par]) {
par = j;
}
}
Bridge(std::min(par, i), std::max(par, i));
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |