#include<iostream> #include<queue> #include<vector> #include<algorithm> #include<cstring> usingnamespace std; constint maxn = 1e5 + 5; int color[maxn]; int len_color[maxn/2]; int num_color=0; int N, q; structNode { int index; vector<Node*>neighbour; }node[maxn]; typedef pair<Node*, int> pni; int len_now = 0; voidpaint_1(Node* a){ if (color[a->index] != -1) return; len_now++; color[a->index] = num_color; for (auto c : a->neighbour) { if (color[c->index] == -1) { paint_1(c); } } } voidpaint(Node* a){ len_now = 0; paint_1(a); len_color[num_color] = len_now; num_color++; } booloperator<(pni a, pni b) { return a.second < b.second; } bool visited[maxn]; intfind(Node* a,Node* b){ memset(visited, 0, N+2); priority_queue<pni>pr; pr.push(pni(a, 0)); Node* tmp = a; while (!pr.empty()) { pni tp = pr.top(); Node* front = tp.first; pr.pop(); for (auto c : front->neighbour) { if (!visited[c->index]) { visited[c->index] = true; if (c == b) return tp.second + 1; pr.push(pni(c, tp.second + 1)); } } }
} intmain(){ cin >> N >> q; for (int i = 0; i <= N; i++) { node[i].index = i; } fill(color, color + N+2, -1); for (int i = 0; i < N; i++) { int a, b; cin >> a >> b; node[a].neighbour.push_back(node+b); node[b].neighbour.push_back(node+a); } for (int i = 0; i < q; i++) { int u, v; cin >> u >> v; if (color[u] == -1) { paint(node + u); } if (color[v] == -1) { paint(node + v); } if (color[u] != color[v]) { cout << -1 << endl; continue; } int dis = find(node + u, node + v); int ans = min(dis, len_color[color[u]] - dis); cout << ans << endl; } return0; }