Problem p03205 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <stdio.h>
#include <vector>
#define MN 200010
#define MM 800010
#define inf 999999999
using namespace std;
int fr[MN], dy[MN], ne[MM], v[MM], w[MM], bs = 0;
void add(int a, int b, int c) {
  v[bs] = b;
  w[bs] = c;
  ne[bs] = fr[a];
  fr[a] = bs++;
}
void addb(int a, int b, int c) {
  add(a, b, c);
  add(b, a, 0);
}
int dl[100010], jl[100010], N, S, T;
bool bk[100010];
bool bfs() {
  for (int i = 1; i <= N; i++) {
    bk[i] = false;
    jl[i] = inf;
  }
  bk[S] = true;
  jl[S] = 0;
  int he = 0, ta = 1;
  dl[0] = S;
  while (he < ta) {
    int u = dl[he++];
    for (int i = fr[u]; i != -1; i = ne[i]) {
      if (w[i] > 0 && !bk[v[i]]) {
        bk[v[i]] = true;
        jl[v[i]] = jl[u] + 1;
        dl[ta++] = v[i];
      }
    }
  }
  return jl[T] < inf;
}
int dfs(int u, int z) {
  if (u == T)
    return z;
  for (int &i = dy[u]; i != -1; i = ne[i]) {
    if (w[i] > 0 && jl[v[i]] == jl[u] + 1) {
      int t = dfs(v[i], z < w[i] ? z : w[i]);
      if (t != -1) {
        w[i] -= t;
        w[i ^ 1] += t;
        return t;
      }
    }
  }
  return -1;
}
int dinic() {
  int jg = 0;
  while (bfs()) {
    for (int i = 1; i <= N; i++)
      dy[i] = fr[i];
    while (1) {
      int t = dfs(S, inf);
      if (t == -1)
        break;
      jg += t;
    }
  }
  return jg;
}
vector<int> ve[100010], to[100010];
int pp[100010], fa[100010];
void dfs2(int u, int f) {
  if (bk[u])
    return;
  fa[u] = f;
  bk[u] = true;
  for (int i = 0; i < to[u].size(); i++)
    dfs2(to[u][i], u);
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n - 1; i++) {
    int s, a;
    scanf("%d", &s);
    for (int j = 0; j < s; j++) {
      scanf("%d", &a);
      ve[i].push_back(a);
    }
  }
  N = n * 2 + 1;
  S = N - 1;
  T = N;
  for (int i = 1; i <= N; i++)
    fr[i] = -1;
  for (int i = 1; i <= n - 1; i++) {
    addb(S, i, 1);
    for (int j = 0; j < ve[i].size(); j++)
      addb(i, ve[i][j] + n - 1, 1);
  }
  for (int i = 1; i <= n; i++)
    addb(i + n - 1, T, 1);
  if (dinic() != n - 1) {
    printf("-1");
    return 0;
  }
  for (int i = 1; i <= n; i++)
    bk[i] = false;
  for (int i = 1; i <= n - 1; i++) {
    for (int j = fr[i]; j != -1; j = ne[j]) {
      int t = v[j];
      if (t > n - 1 && w[j] == 0) {
        pp[i] = t - (n - 1);
        break;
      }
    }
    for (int j = 0; j < ve[i].size(); j++) {
      if (ve[i][j] != pp[i])
        to[ve[i][j]].push_back(pp[i]);
    }
    bk[pp[i]] = true;
  }
  int ro = -1;
  for (int i = 1; i <= n; i++) {
    if (!bk[i]) {
      ro = i;
      break;
    }
  }
  for (int i = 1; i <= n; i++)
    bk[i] = false;
  dfs2(ro, 0);
  for (int i = 1; i <= n; i++) {
    if (i != ro && fa[i] == 0) {
      printf("-1");
      return 0;
    }
  }
  for (int i = 1; i <= n - 1; i++)
    printf("%d %d\n", pp[i], fa[pp[i]]);
  return 0;
}

Fixed submission:
#include <stdio.h>
#include <vector>
#define MN 200010
#define MM 800010
#define inf 999999999
using namespace std;
int fr[MN], dy[MN], ne[MM], v[MM], w[MM], bs = 0;
void add(int a, int b, int c) {
  v[bs] = b;
  w[bs] = c;
  ne[bs] = fr[a];
  fr[a] = bs++;
}
void addb(int a, int b, int c) {
  add(a, b, c);
  add(b, a, 0);
}
int dl[MN], jl[MN], N, S, T;
bool bk[MN];
bool bfs() {
  for (int i = 1; i <= N; i++) {
    bk[i] = false;
    jl[i] = inf;
  }
  bk[S] = true;
  jl[S] = 0;
  int he = 0, ta = 1;
  dl[0] = S;
  while (he < ta) {
    int u = dl[he++];
    for (int i = fr[u]; i != -1; i = ne[i]) {
      if (w[i] > 0 && !bk[v[i]]) {
        bk[v[i]] = true;
        jl[v[i]] = jl[u] + 1;
        dl[ta++] = v[i];
      }
    }
  }
  return jl[T] < inf;
}
int dfs(int u, int z) {
  if (u == T)
    return z;
  for (int &i = dy[u]; i != -1; i = ne[i]) {
    if (w[i] > 0 && jl[v[i]] == jl[u] + 1) {
      int t = dfs(v[i], z < w[i] ? z : w[i]);
      if (t != -1) {
        w[i] -= t;
        w[i ^ 1] += t;
        return t;
      }
    }
  }
  return -1;
}
int dinic() {
  int jg = 0;
  while (bfs()) {
    for (int i = 1; i <= N; i++)
      dy[i] = fr[i];
    while (1) {
      int t = dfs(S, inf);
      if (t == -1)
        break;
      jg += t;
    }
  }
  return jg;
}
vector<int> ve[100010], to[100010];
int pp[100010], fa[100010];
void dfs2(int u, int f) {
  if (bk[u])
    return;
  fa[u] = f;
  bk[u] = true;
  for (int i = 0; i < to[u].size(); i++)
    dfs2(to[u][i], u);
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n - 1; i++) {
    int s, a;
    scanf("%d", &s);
    for (int j = 0; j < s; j++) {
      scanf("%d", &a);
      ve[i].push_back(a);
    }
  }
  N = n * 2 + 1;
  S = N - 1;
  T = N;
  for (int i = 1; i <= N; i++)
    fr[i] = -1;
  for (int i = 1; i <= n - 1; i++) {
    addb(S, i, 1);
    for (int j = 0; j < ve[i].size(); j++)
      addb(i, ve[i][j] + n - 1, 1);
  }
  for (int i = 1; i <= n; i++)
    addb(i + n - 1, T, 1);
  if (dinic() != n - 1) {
    printf("-1");
    return 0;
  }
  for (int i = 1; i <= n; i++)
    bk[i] = false;
  for (int i = 1; i <= n - 1; i++) {
    for (int j = fr[i]; j != -1; j = ne[j]) {
      int t = v[j];
      if (t > n - 1 && w[j] == 0) {
        pp[i] = t - (n - 1);
        break;
      }
    }
    for (int j = 0; j < ve[i].size(); j++) {
      if (ve[i][j] != pp[i])
        to[ve[i][j]].push_back(pp[i]);
    }
    bk[pp[i]] = true;
  }
  int ro = -1;
  for (int i = 1; i <= n; i++) {
    if (!bk[i]) {
      ro = i;
      break;
    }
  }
  for (int i = 1; i <= n; i++)
    bk[i] = false;
  dfs2(ro, 0);
  for (int i = 1; i <= n; i++) {
    if (i != ro && fa[i] == 0) {
      printf("-1");
      return 0;
    }
  }
  for (int i = 1; i <= n - 1; i++)
    printf("%d %d\n", pp[i], fa[pp[i]]);
  return 0;
}