Problem p02942 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
namespace maxflow {
#define inf 999999999
struct edge {
  int to, nxt, f;
} e[20001];
int head[211];
int edge_cnt;
int s, t;
void init(int s1, int t1) {
  s = s1, t = t1;
  edge_cnt = -1;
  memset(head, -1, sizeof(head));
}
void add(int u, int v, int f) {
  e[++edge_cnt].nxt = head[u];
  e[edge_cnt].to = v;
  e[edge_cnt].f = f;
  head[u] = edge_cnt;
}
void add_edge(int u, int v, int f) {
  add(u, v, f);
  add(v, u, 0);
}
int dep[211];
bool bfs(int s, int t) {
  memset(dep, 0x3f, sizeof(dep));
  queue<int> q;
  q.push(s);
  dep[s] = 0;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = head[u]; i != -1; i = e[i].nxt)
      if (e[i].f != 0) {
        int to = e[i].to;
        if (dep[to] > dep[u] + 1) {
          dep[to] = dep[u] + 1;
          q.push(to);
        }
      }
  }
  return dep[t] < inf;
}
int dfs(int u, int flow) {
  if (u == t)
    return flow;
  int use = flow;
  for (int i = head[u]; i != -1; i = e[i].nxt) {
    int to = e[i].to;
    if (use && dep[to] == dep[u] + 1 && e[i].f) {
      int f = dfs(to, min(e[i].f, use));
      use -= f;
      e[i].f -= f;
      e[i ^ 1].f += f;
    }
  }
  return flow - use;
}
int dinic() {
  int maxflow = 0;
  while (bfs(s, t))
    maxflow += dfs(s, inf);
  return maxflow;
}
} // namespace maxflow
using namespace maxflow;
int c[101][101];
int a[101][101];
vector<int> rem[101][101];
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      scanf("%d", &a[i][j]);
      rem[i][(a[i][j] + m - 1) / m].push_back(a[i][j]);
    }
  for (int p = 1; p <= m; p++) {
    init(0, 210);

    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++)
        if (rem[i][j].size())
          add_edge(i, j + n + 1, 1);
      add_edge(s, i, 1);
      add_edge(i + n + 1, t, 1);
    }
    dinic();
    //	printf("%d\n",dinic());
    for (int i = 1; i <= n; i++) {
      int at = 0;
      for (int j = head[i]; j != -1; j = e[j].nxt)
        if (e[j].f == 0 && e[j].to > n + 1)
          at = e[j].to - n - 1;
      c[i][p] = rem[i][at].back();
      rem[i][at].pop_back();
    }
    //	for(int t=1;t<=n;t++)
    //		printf("%d ",c[t][p]);
    //	printf("\n");
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      printf("%d ", c[i][j]);
    printf("\n");
  }
  for (int j = 1; j <= m; j++) {
    for (int i = 1; i <= n; i++)
      for (int k = i + 1; k <= n; k++)
        if (c[k][j] <= c[i][j])
          swap(c[k][j], c[i][j]);
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      printf("%d ", c[i][j]);
    printf("\n");
  }
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
namespace maxflow {
#define inf 999999999
struct edge {
  int to, nxt, f;
} e[200001];
int head[211];
int edge_cnt;
int s, t;
void init(int s1, int t1) {
  s = s1, t = t1;
  edge_cnt = -1;
  memset(head, -1, sizeof(head));
}
void add(int u, int v, int f) {
  e[++edge_cnt].nxt = head[u];
  e[edge_cnt].to = v;
  e[edge_cnt].f = f;
  head[u] = edge_cnt;
}
void add_edge(int u, int v, int f) {
  add(u, v, f);
  add(v, u, 0);
}
int dep[211];
bool bfs(int s, int t) {
  memset(dep, 0x3f, sizeof(dep));
  queue<int> q;
  q.push(s);
  dep[s] = 0;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = head[u]; i != -1; i = e[i].nxt)
      if (e[i].f != 0) {
        int to = e[i].to;
        if (dep[to] > dep[u] + 1) {
          dep[to] = dep[u] + 1;
          q.push(to);
        }
      }
  }
  return dep[t] < inf;
}
int dfs(int u, int flow) {
  if (u == t)
    return flow;
  int use = flow;
  for (int i = head[u]; i != -1; i = e[i].nxt) {
    int to = e[i].to;
    if (use && dep[to] == dep[u] + 1 && e[i].f) {
      int f = dfs(to, min(e[i].f, use));
      use -= f;
      e[i].f -= f;
      e[i ^ 1].f += f;
    }
  }
  return flow - use;
}
int dinic() {
  int maxflow = 0;
  while (bfs(s, t))
    maxflow += dfs(s, inf);
  return maxflow;
}
} // namespace maxflow
using namespace maxflow;
int c[101][101];
int a[101][101];
vector<int> rem[101][101];
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      scanf("%d", &a[i][j]);
      rem[i][(a[i][j] + m - 1) / m].push_back(a[i][j]);
    }
  for (int p = 1; p <= m; p++) {
    init(0, 210);

    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++)
        if (rem[i][j].size())
          add_edge(i, j + n + 1, 1);
      add_edge(s, i, 1);
      add_edge(i + n + 1, t, 1);
    }
    dinic();
    //	printf("%d\n",dinic());
    for (int i = 1; i <= n; i++) {
      int at = 0;
      for (int j = head[i]; j != -1; j = e[j].nxt)
        if (e[j].f == 0 && e[j].to > n + 1)
          at = e[j].to - n - 1;
      c[i][p] = rem[i][at].back();
      rem[i][at].pop_back();
    }
    //	for(int t=1;t<=n;t++)
    //		printf("%d ",c[t][p]);
    //	printf("\n");
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      printf("%d ", c[i][j]);
    printf("\n");
  }
  for (int j = 1; j <= m; j++) {
    for (int i = 1; i <= n; i++)
      for (int k = i + 1; k <= n; k++)
        if (c[k][j] <= c[i][j])
          swap(c[k][j], c[i][j]);
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      printf("%d ", c[i][j]);
    printf("\n");
  }
  return 0;
}