Advertisement
Tbl_Mne_Ne_Dryg

Untitled

Oct 15th, 2020
380
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. vector<vector<int>> g;
  6. vector<int> tin;
  7. vector<int> tup;
  8. vector<bool> used;
  9. int timer = 0;
  10.  
  11. void dfs_tree(int v) {
  12.     used[v] = true;
  13.     tin[v] = timer;
  14.     tup[v] = timer;
  15.     timer++;
  16.     for(int i = 0; i < g[v].size(); i++) {
  17.         int to = g[v][i];
  18.         if(used[to]) {
  19.             tup[v] = min(tup[v], tin[to]);
  20.         }
  21.         else {
  22.             dfs_tree(to);
  23.             tup[v] = min(tup[v], tup[to]);
  24.         }
  25.     }
  26. }
  27.  
  28. vector<int> path;
  29. vector<int> pr;
  30. void dfs(int v) {
  31.     used[v] = true;
  32.     for(int i = 0; i < g[v].size(); i++) {
  33.         int to = g[v][i];
  34.         if(!used[to]) {
  35.             pr[to] = v;
  36.             dfs(to);
  37.         }
  38.     }
  39. }
  40.  
  41. int main() {
  42.     int n, m;
  43.     cin >> n >> m;
  44.     g.resize(n);
  45.     used.resize(n);
  46.     tin.resize(n);
  47.     tup.resize(n);
  48.     pr.resize(n);
  49.     for(int i = 0; i < m; i++) {
  50.         int f, t;
  51.         cin >> f >> t;
  52.         f--;
  53.         t--;
  54.         g[f].push_back(t);
  55.         g[t].push_back(f);
  56.     }
  57.     int tt;
  58.     cin >> tt;
  59.     while (tt--) {
  60.         int a, b;
  61.         cin >> a >> b;
  62.         a--;
  63.         b--;
  64.         used = vector<bool>(n, false);
  65.         timer = 0;
  66.         dfs_tree(a);
  67.         used = vector<bool>(n, false);
  68.         pr = vector<int>(n, -1);
  69.         dfs(a);
  70.         int x = b;
  71.         while (x != a) {
  72.             path.push_back(x);
  73.             x = pr[x];
  74.         }
  75.         path.push_back(a);
  76.         reverse(path.begin(), path.end());
  77.         int ans = 0;
  78.         for(int i = 1; i < path.size() - 1; i++) {
  79.             if(tin[path[i]] <= tup[path[i + 1]]) ans++;
  80.         }
  81.         path.clear();
  82.         cout << ans << '\n';
  83.     }
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement