Problem p02942 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <vector>

using namespace std;
typedef long long ll;
const int MAXN = 105;
int n, m, a[MAXN][MAXN];
vector<int> gr[MAXN][MAXN];
inline void addEdge(int u, int v, int c) {
  gr[u][v].push_back(c), gr[v][u].push_back(c);
}
int match[MAXN << 2];
bool vis[MAXN << 2];
inline bool dfs(int u) {
  for (int i = n + 1; i <= 2 * n; i++)
    if (!vis[i] && !gr[u][i].empty()) {
      vis[i] = true;
      if (match[i] < 0 || dfs(match[i])) {
        match[i] = u;
        return true;
      }
    }
  return false;
}
inline int calc(int x) { return (x - 1) / m + 1; }
int ansb[MAXN][MAXN], tmp[MAXN], ansc[MAXN][MAXN];

int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      cin >> a[i][j];
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      addEdge(i, n + calc(a[i][j]), a[i][j]);
  for (int i = 1; i <= m; i++) {
    memset(match, -1, sizeof(match));
    for (int j = 1; j <= n; j++) {
      memset(vis, 0, sizeof(vis));
      dfs(j);
    }
    for (int j = n + 1; j <= 2 * n; j++) {
      ansb[match[j]][i] = gr[j][match[j]][gr[j][match[j]].size() - 1];
      gr[j][match[j]].pop_back(), gr[match[j]][j].pop_back();
    }
  }
  for (int i = 1; i <= m; i++) {
    for (int j = 1; j <= n; j++)
      tmp[j] = ansb[j][i];
    sort(tmp + 1, tmp + n + 1);
    for (int j = 1; j <= n; j++)
      ansc[j][i] = tmp[j];
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      cout << ansb[i][j] << " ";
    cout << endl;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      cout << ansc[i][j] << " ";
    cout << endl;
  }
  return 0;
}


Fixed submission:
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <vector>

using namespace std;
typedef long long ll;
const int MAXN = 505;
int n, m, a[MAXN][MAXN];
vector<int> gr[MAXN][MAXN];
inline void addEdge(int u, int v, int c) {
  gr[u][v].push_back(c), gr[v][u].push_back(c);
}
int match[MAXN << 2];
bool vis[MAXN << 2];
inline bool dfs(int u) {
  for (int i = n + 1; i <= 2 * n; i++)
    if (!vis[i] && !gr[u][i].empty()) {
      vis[i] = true;
      if (match[i] < 0 || dfs(match[i])) {
        match[i] = u;
        return true;
      }
    }
  return false;
}
inline int calc(int x) { return (x - 1) / m + 1; }
int ansb[MAXN][MAXN], tmp[MAXN], ansc[MAXN][MAXN];

int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      cin >> a[i][j];
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
      addEdge(i, n + calc(a[i][j]), a[i][j]);
  for (int i = 1; i <= m; i++) {
    memset(match, -1, sizeof(match));
    for (int j = 1; j <= n; j++) {
      memset(vis, 0, sizeof(vis));
      dfs(j);
    }
    for (int j = n + 1; j <= 2 * n; j++) {
      ansb[match[j]][i] = gr[j][match[j]][gr[j][match[j]].size() - 1];
      gr[j][match[j]].pop_back(), gr[match[j]][j].pop_back();
    }
  }
  for (int i = 1; i <= m; i++) {
    for (int j = 1; j <= n; j++)
      tmp[j] = ansb[j][i];
    sort(tmp + 1, tmp + n + 1);
    for (int j = 1; j <= n; j++)
      ansc[j][i] = tmp[j];
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      cout << ansb[i][j] << " ";
    cout << endl;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      cout << ansc[i][j] << " ";
    cout << endl;
  }
  return 0;
}