#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<b;i++)
template<int NV> struct UF {
int par[NV], cnt[NV];
UF() { rep(i, 0, NV) par[i] = i, cnt[i] = 1; }
int operator[](int x) { return par[x] == x ? x : par[x] = operator[](par[x]); }
void operator()(int x, int y) { // xをyにくっつける
x = operator[](x); y = operator[](y);
if (x != y) par[x] = y, cnt[y] += cnt[x];
}
};
int N;
//-----------------------------------------------------------------
set<int> E[101010];
UF<101010> uf;
void merge(int a, int b) {
//printf("[%d %d]\n", a, b);
a = uf[a], b = uf[b];
if (a == b) return;
if (E[a].size() > E[b].size()) swap(a, b);
set<pair<int, int>> next;
for (int to : E[a]) if (to != b) {
E[to].erase(a);
if (E[to].count(b)) next.insert({ b, to });
E[to].insert(b);
E[b].insert(to);
}
E[b].erase(a);
E[a].clear();
uf(a, b);
for (auto p : next) merge(p.first, p.second);
}
void addEdge(int _a, int _b) {
int a = uf[_a];
int b = uf[_b];
//printf("<%d %d>\n", a, b);
if (!E[a].count(b)) {
E[a].insert(b);
E[b].insert(a);
return;
}
merge(a, b);
}
//-----------------------------------------------------------------
int main() {
cin >> N;
rep(i, 0, N - 1) {
int a, b; scanf("%d%d", &a, &b);
addEdge(a, b);
}
rep(i, 0, N - 1) {
int a, b; scanf("%d%d", &a, &b);
addEdge(a, b);
}
set<int> u;
rep(i, 1, N + 1) u.insert(uf[i]);
if (u.size() == 1) printf("YES\n");
else printf("NO\n");
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:57:40: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
int a, b; scanf("%d%d", &a, &b);
^
./Main.cpp:61:40: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
int a, b; scanf("%d%d", &a, &b);
^