Problem p03727 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#define mp(x, y) make_pair(x, y)
using namespace std;
typedef pair<int, int> pi;
const int N = 100005;
int n, f[N];
set<int> se[N];
map<pi, int> ma;
queue<pi> que;
inline int read() {
  int x = 0, f = 0, c = getchar();
  for (; c > '9' || c < '0'; f = c == '-', c = getchar())
    ;
  for (; c >= '0' && c <= '9'; c = getchar())
    x = (x << 1) + (x << 3) + c - '0';
  return f ? -x : x;
}
inline int find(int x) { return f[x] == x ? x : f[x] = find(f[x]); }
int main() {
  freopen("1.in", "r", stdin);
  // freopen("1.out","w",stdout);
  int i, x, y;
  n = read();
  for (i = 1; i <= n + n - 2; i++) {
    x = read();
    y = read();
    se[x].insert(y);
    se[y].insert(x);
    ma[mp(x, y)]++;
    ma[mp(y, x)]++;
    if (ma[mp(x, y)] == 2)
      que.push(mp(x, y));
  }
  for (i = 1; i <= n; i++)
    f[i] = i;
  set<int>::iterator it;
  while (!que.empty()) {
    x = que.front().first;
    y = que.front().second;
    que.pop();
    x = find(x);
    y = find(y);
    se[x].erase(y);
    se[y].erase(x);
    if (se[x].size() < se[y].size())
      swap(x, y);
    for (it = se[y].begin(); it != se[y].end(); it++) {
      int to = (*it);
      ma[mp(to, y)] = ma[mp(y, to)] = 0;
      se[to].erase(y);
      se[to].insert(x);
      ma[mp(to, x)]++;
      ma[mp(x, to)]++;
      if (ma[mp(to, x)] == 2)
        que.push(mp(to, x));
      se[x].insert(to);
    }
    f[y] = x;
    se[y].clear();
  }
  int s = 0;
  for (i = 1; i <= n; i++)
    s += f[i] == i;
  puts(s == 1 ? "YES" : "NO");
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#define mp(x, y) make_pair(x, y)
using namespace std;
typedef pair<int, int> pi;
const int N = 100005;
int n, f[N];
set<int> se[N];
map<pi, int> ma;
queue<pi> que;
inline int read() {
  int x = 0, f = 0, c = getchar();
  for (; c > '9' || c < '0'; f = c == '-', c = getchar())
    ;
  for (; c >= '0' && c <= '9'; c = getchar())
    x = (x << 1) + (x << 3) + c - '0';
  return f ? -x : x;
}
inline int find(int x) { return f[x] == x ? x : f[x] = find(f[x]); }
int main() {
  int i, x, y;
  n = read();
  for (i = 1; i <= n + n - 2; i++) {
    x = read();
    y = read();
    se[x].insert(y);
    se[y].insert(x);
    ma[mp(x, y)]++;
    ma[mp(y, x)]++;
    if (ma[mp(x, y)] == 2)
      que.push(mp(x, y));
  }
  for (i = 1; i <= n; i++)
    f[i] = i;
  set<int>::iterator it;
  while (!que.empty()) {
    x = que.front().first;
    y = que.front().second;
    que.pop();
    x = find(x);
    y = find(y);
    se[x].erase(y);
    se[y].erase(x);
    if (se[x].size() < se[y].size())
      swap(x, y);
    for (it = se[y].begin(); it != se[y].end(); it++) {
      int to = (*it);
      ma[mp(to, y)] = ma[mp(y, to)] = 0;
      se[to].erase(y);
      se[to].insert(x);
      ma[mp(to, x)]++;
      ma[mp(x, to)]++;
      if (ma[mp(to, x)] == 2)
        que.push(mp(to, x));
      se[x].insert(to);
    }
    f[y] = x;
    se[y].clear();
  }
  int s = 0;
  for (i = 1; i <= n; i++)
    s += f[i] == i;
  puts(s == 1 ? "YES" : "NO");
  return 0;
}