#include #define rep(i, n) for(int i = 0; i < (int)n; i++) using namespace std; using ll = long long; int n; vector> g; vector be; int max_dist = 0; pair dfs(int v, int p) { pair ret = {-1, 0}; vector vec; if(be[v] % 2) { vec.push_back(0); } rep(i, g[v].size()) { if(g[v][i] == p) continue; auto tmp = dfs(g[v][i], v); ret.second += tmp.second; if(tmp.first != -1) { vec.push_back(tmp.first + 1); ret.second++; } } sort(vec.begin(), vec.end()); if((int)vec.size() >= 2) { max_dist = max(max_dist, vec[(int)vec.size() - 1] + vec[(int)vec.size() - 2]); } if((int)vec.size() % 2 == 1) { ret.first = vec[(int)vec.size() - 1]; } return ret; } int main() { cin >> n; g.resize(n); be.assign(n, 0); rep(i, n - 1) { int a, b; cin >> a >> b; a--; b--; g[a].push_back(b); g[b].push_back(a); } rep(i, n - 1) { int c, d; cin >> c >> d; c--; d--; be[c]++; be[d]++; } auto tmp = dfs(0, -1); cout << tmp.second + n - 1 - max_dist << endl; return 0; }