Pagini recente » Cod sursa (job #1478582) | Cod sursa (job #2729208) | Monitorul de evaluare | Cod sursa (job #1428260) | Cod sursa (job #3267254)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int MAXN = 1005;
int parent[MAXN];
int depth[MAXN];
vector<int> adj[MAXN];
int n, m;
void dfs(int nod, int parinte) {
parent[nod] = parinte;
for (int i = 0; i < adj[nod].size(); ++i) {
int vecin = adj[nod][i];
if (vecin != parinte) {
depth[vecin] = depth[nod] + 1;
dfs(vecin, nod);
}
}
}
int lca(int u, int v) {
while (depth[u] > depth[v]) u = parent[u];
while (depth[v] > depth[u]) v = parent[v];
while (u != v) {
u = parent[u];
v = parent[v];
}
return u;
}
int main() {
ifstream in("lca.in");
ofstream out("lca.out");
in >> n >> m;
for (int i = 1; i < n; ++i) {
int a, b;
in >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
depth[1] = 0;
dfs(1, 0);
for (int i = 0; i < m; ++i) {
int u, v;
in >> u >> v;
out << lca(u, v) << "\n";
}
return 0;
}