Guest User

M.cpp

a guest
Jan 21st, 2026
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.17 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define sz(x) (int)((x).size())
  4. #define ll long long
  5. #define intmax INT_MAX
  6. #define intmin INT_MIN
  7. #define llmax LONG_MAX
  8. #define llmin LONG_MIN
  9. #define pb push_back
  10. #define f first
  11. #define s second
  12. #define ent '\n'
  13.  
  14. const ll infl = 1e18;
  15. const int INF = 1e9 + 9;
  16. const int mod = 1e9 + 7;
  17. const int MAXN = 1e5 + 7;
  18.  
  19. map <pair <int, int>, bool > ma;
  20. vector <pair <int, int> > vec;
  21.  
  22. int up[MAXN][20];
  23. int tin[MAXN], tout[MAXN], l, col[MAXN], fup[MAXN], h[MAXN];
  24. int timer = 0;
  25. bool was[MAXN], was2[MAXN];
  26.  
  27. vector <int> g[MAXN], g2[MAXN];
  28. void is_bridge(int x, int y){
  29.     ma[{x, y}] = 1;
  30.     ma[{y, x}] = 1;
  31.     vec.pb({x, y});
  32. }
  33.  
  34. void dfs(int x, int pr = -1){
  35.     was[x] = 1;
  36.     timer++;
  37.     tin[x] = timer;
  38.     fup[x] = tin[x];
  39.  
  40.     for (int i = 0; i < g[x].size(); i++){
  41.         int to = g[x][i];
  42.  
  43.         if (!was[to]){
  44.             dfs(to, x);
  45.             fup[x] = min(fup[x], fup[to]);
  46.             if (tin[x] < fup[to]){
  47.                 is_bridge(x, to);
  48.             }
  49.         }
  50.         else if (to != pr){
  51.             fup[x] = min(fup[x], tin[to]);
  52.         }
  53.  
  54.     }
  55. }
  56.  
  57. void dfs2(int x, int color){
  58.     was2[x] = true;
  59.     col[x] = color;
  60.     for (int i = 0; i < g[x].size(); i++){
  61.         int to = g[x][i];
  62.         if (ma.count({x, to}) == 0 && !was2[to]){
  63.             dfs2(to, color);
  64.         }
  65.     }
  66. }
  67.  
  68. bool upper(int a, int b){
  69.     return (tin[a] <= tin[b] && tout[a] >= tout[b]);
  70. }
  71.  
  72. void dfs3(int x, int y, int p = 0){
  73.     was[x] = 1;
  74.     tin[x] = ++timer;
  75.     up[x][0] = p;
  76.     h[x] = y;
  77.     for (int i = 1; i <= l; i++){
  78.         up[x][i] = up[up[x][i - 1]][i - 1];
  79.     }
  80.  
  81.     for (int i = 0; i < g2[x].size(); i++){
  82.         int to = g2[x][i];
  83.         if (!was[to]){
  84.             dfs3(to, y + 1, x);
  85.         }
  86.     }
  87.     tout[x] = ++timer;
  88. }
  89.  
  90. int lca(int a, int b){
  91.     if (upper(a, b))
  92.         return a;
  93.     if (upper(b, a))
  94.         return b;
  95.  
  96.     for (int i = l; i >= 0; i--){
  97.         if (!upper(up[a][i], b))
  98.             a = up[a][i];
  99.     }
  100.  
  101.     return up[a][0];
  102. }
  103.  
  104.  
  105. void solve(){
  106.     int n, m;
  107.     cin >> n >> m;
  108.  
  109.     for (int i = 1; i <= m; i++){
  110.         int x, y;
  111.         cin >> x >> y;
  112.         g[x].pb(y);
  113.         g[y].pb(x);
  114.     }
  115.  
  116.     dfs(1);
  117.     int k = 0;
  118.     for (int i = 1; i <= n; i++){
  119.         if (!was2[i]){
  120.             k++;
  121.             dfs2(i, k);
  122.         }
  123.     }
  124.  
  125.     //cout << "!!!" << vec.size() << endl;
  126.     for (int i = 0; i < vec.size(); i++){
  127.         int x = vec[i].f;
  128.         int y = vec[i].s;
  129.         //cout << "@@@ " << col[x] << ' ' << col[y] << "\n";
  130.         g2[col[x]].pb(col[y]);
  131.         g2[col[y]].pb(col[x]);
  132.     }
  133.     for (int i = 1; i <= n; i++){
  134.         was[i] = 0;
  135.         tin[i] = 0;
  136.     }
  137.     tout[0] = INF;
  138.     timer = 0;
  139.     l = 0;
  140.     while ((1 << l) < MAXN){
  141.         l++;
  142.     }
  143.     dfs3(1, 0);
  144.     int q;
  145.     cin >> q;
  146.  
  147.     while(q--){
  148.         int x, y;
  149.         cin >> x >> y;
  150.         cout << h[col[x]] + h[col[y]] - 2 * h[lca(col[x], col[y])] << "\n";
  151.     }
  152.  
  153. }
  154.  
  155. int main(){
  156.     ios::sync_with_stdio(0);
  157.     cin.tie(0); cout.tie(0);
  158.     int t = 1;
  159.     // cin >> t;
  160.     while(t--) solve();
  161. }
  162.  
Advertisement
Add Comment
Please, Sign In to add comment