Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- vector<vector<int>> g;
- vector<int> tin;
- vector<int> tup;
- vector<bool> used;
- int timer = 0;
- void dfs_tree(int v) {
- used[v] = true;
- tin[v] = timer;
- tup[v] = timer;
- timer++;
- for(int i = 0; i < g[v].size(); i++) {
- int to = g[v][i];
- if(used[to]) {
- tup[v] = min(tup[v], tin[to]);
- }
- else {
- dfs_tree(to);
- tup[v] = min(tup[v], tup[to]);
- }
- }
- }
- vector<int> path;
- vector<int> pr;
- void dfs(int v) {
- used[v] = true;
- for(int i = 0; i < g[v].size(); i++) {
- int to = g[v][i];
- if(!used[to]) {
- pr[to] = v;
- dfs(to);
- }
- }
- }
- int main() {
- int n, m;
- cin >> n >> m;
- g.resize(n);
- used.resize(n);
- tin.resize(n);
- tup.resize(n);
- pr.resize(n);
- for(int i = 0; i < m; i++) {
- int f, t;
- cin >> f >> t;
- f--;
- t--;
- g[f].push_back(t);
- g[t].push_back(f);
- }
- int tt;
- cin >> tt;
- while (tt--) {
- int a, b;
- cin >> a >> b;
- a--;
- b--;
- used = vector<bool>(n, false);
- timer = 0;
- dfs_tree(a);
- used = vector<bool>(n, false);
- pr = vector<int>(n, -1);
- dfs(a);
- int x = b;
- while (x != a) {
- path.push_back(x);
- x = pr[x];
- }
- path.push_back(a);
- reverse(path.begin(), path.end());
- int ans = 0;
- for(int i = 1; i < path.size() - 1; i++) {
- if(tin[path[i]] <= tup[path[i + 1]]) ans++;
- }
- path.clear();
- cout << ans << '\n';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement