Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <utility>
- #include <vector>
- #include <stack>
- using std::vector;
- using std::stack;
- using std::cerr;
- using std::cout;
- using std::pair;
- using std::swap;
- using std::cin;
- using std::min;
- using vint = vector<int>;
- using vbool = vector<bool>;
- using Graph = vector<vint>;
- void add_edge(Graph &a, int u, int v) {
- a[u].push_back(v);
- a[v].push_back(u);
- }
- void paint(vint &color, stack<int> &q, int &col, int v) {
- for (int u = -1; u != v;) {
- u = q.top();
- color[u] = col;
- q.pop();
- }
- col++;
- }
- void dfs(const Graph &a, vbool &used, stack<int> &q, vint &even, vint &color, vint &ret, int &tim, int &col, int v, int p = -1) {
- tim++;
- used[v] = true;
- q.push(v);
- even[v] = tim;
- ret[v] = tim;
- for (auto to : a[v]) {
- if (to == p) {
- continue;
- }
- if (used[to]) {
- ret[v] = min(ret[v], even[to]);
- } else {
- dfs(a, used, q, even, color, ret, tim, col, to, v);
- ret[v] = min(ret[v], ret[to]);
- if (ret[to] > even[v]) {
- paint(color, q, col, to);
- }
- }
- }
- }
- int lca(const vector<vint> &parent, const vint &height, int u, int v) {
- if (height[v] < height[u]) {
- swap(v, u);
- }
- for (int w = (int) parent[v].size() - 1; w >= 0; w--) {
- if (height[parent[v][w]] >= height[u]) {
- v = parent[v][w];
- }
- }
- if (u == v) {
- return u;
- }
- for (int w = (int) parent[v].size() - 1; w >= 0; w--) {
- if (parent[v][w] != parent[u][w]) {
- v = parent[v][w];
- u = parent[u][w];
- }
- }
- return parent[v][0];
- }
- int main() {
- size_t n, m;
- cin >> n >> m;
- size_t f;
- cin >> f;
- f--;
- Graph a(n);
- for (size_t i = 0; i < m; i++) {
- int u, v;
- cin >> u >> v;
- add_edge(a, u - 1, v - 1);
- }
- vbool used(n, false);
- stack<int> q;
- vint even(n, -1);
- vint ret(n, -1);
- vint color(n, -1);
- int tim = 0, col = 0;
- dfs(a, used, q, even, color, ret, tim, col, f);
- paint(color, q, col, f);
- int k = 0;
- while ((1 << k) <= col) k++;
- f = color[f];
- vector<vint> parent((size_t) col, vint((size_t) k, f));
- for (size_t i = 0; i < n; i++) {
- for (auto to : a[i]) {
- int u = color[i];
- int v = color[to];
- if (u > v) {
- parent[v][0] = u;
- }
- }
- }
- vint height((size_t) col, 0);
- for (int i = col - 2; i >= 0; i--) {
- height[i] = height[parent[i][0]] + 1;
- }
- for (int w = 0; w + 1 < k; w++) {
- for (int i = 0; i < col; i++) {
- parent[i][w + 1] = parent[parent[i][w]][w];
- }
- }
- int qn;
- cin >> qn;
- for (int i = 0; i < qn; i++) {
- int u, v;
- cin >> u >> v;
- int s = lca(parent, height, color[u - 1], color[v - 1]);
- cout << height[s] << "\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment