Problem p00744 (C++)

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

using namespace std;

const int MAX_V = 1100;
const int INF = 100000000;

// &#65533;&#65533;&#65533;_&#65533;&#65533;
int V;
// &#65533;O&#65533;&#65533;&#65533;t&#65533;&#771;&#65533;&#65533;X&#65533;g&#65533;\&#65533;&#65533;
vector<int> G[MAX_V];
// &#65533;}&#65533;b&#65533;`&#65533;&#65533;&#65533;O&#65533;&#771;y&#65533;A
int match[MAX_V];
// dfs&#65533;&#322;&#65533;&#65533;&#322;&#594;&#65533;&#65533;&#1474;&#65533;&#65533;&#65533;&#65533;&#450;&#65533;&#65533;&#65533;&#65533;&#771;t&#65533;&#65533;&#65533;O
static bool used[MAX_V];

// u&#65533;&#65533;v&#65533;&#65533;&#1301;&#1218;&#65533;O&#65533;&#65533;&#65533;t&#65533;&#594;&#457;&#65533;
void add_edge(int u, int v) {
  G[u].push_back(v);
  G[v].push_back(u);
}

// &#65533;&#65533;&#65533;&#65533;p&#65533;X&#65533;&#65533;dfs&#65533;&#338;T&#65533;&#65533;
bool dfs(int v) {
  used[v] = true;
  for (int i = 0; i < G[v].size(); i++) {
    int u = G[v][i], w = match[u];
    if (w < 0 || !used[w] && dfs(w)) {
      match[v] = u;
      match[u] = v;
      return true;
    }
  }
  return false;
}

// &#65533;&#349443;O&#65533;&#65533;&#65533;t&#65533;&#781;&#337;&#65533;}&#65533;b&#65533;`&#65533;&#65533;&#65533;O&#65533;&#65533;&#1986;&#65533;
int bipartite_matching() {
  int res = 0;
  // memset(match,-1,sizeof(match));
  for (int i = 0; i < MAX_V; i++)
    match[i] = -1;
  for (int v = 0; v < V; v++) {
    if (match[v] < 0) {
      memset(used, 0, sizeof(used));
      if (dfs(v)) {
        res++;
      }
    }
  }
  return res;
}

int gcd(int a, int b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}

int main() {

  int n, m;
  vector<int> bs, rs;
  int b, r;

  while (cin >> m >> n && !(m == 0 && n == 0)) {
    for (int i = 0; i < MAX_V; i++)
      G[i].clear();

    V = n + m;
    for (int i = 0; i < m; i++) {
      cin >> b;
      bs.push_back(b);
    }
    for (int i = 0; i < n; i++) {
      cin >> r;
      rs.push_back(r);
    }
    for (int i = 0; i < rs.size(); i++) {
      for (int j = 0; j < bs.size(); j++) {
        int res = gcd(rs[i], bs[j]);
        if (res > 1)
          add_edge(i, j + rs.size());
      }
    }
    cout << bipartite_matching() << endl;
  }

  return 0;
}

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

using namespace std;

const int MAX_V = 1100;
const int INF = 100000000;

// &#65533;&#65533;&#65533;_&#65533;&#65533;
int V;
// &#65533;O&#65533;&#65533;&#65533;t&#65533;&#771;&#65533;&#65533;X&#65533;g&#65533;\&#65533;&#65533;
vector<int> G[MAX_V];
// &#65533;}&#65533;b&#65533;`&#65533;&#65533;&#65533;O&#65533;&#771;y&#65533;A
int match[MAX_V];
// dfs&#65533;&#322;&#65533;&#65533;&#322;&#594;&#65533;&#65533;&#1474;&#65533;&#65533;&#65533;&#65533;&#450;&#65533;&#65533;&#65533;&#65533;&#771;t&#65533;&#65533;&#65533;O
static bool used[MAX_V];

// u&#65533;&#65533;v&#65533;&#65533;&#1301;&#1218;&#65533;O&#65533;&#65533;&#65533;t&#65533;&#594;&#457;&#65533;
void add_edge(int u, int v) {
  G[u].push_back(v);
  G[v].push_back(u);
}

// &#65533;&#65533;&#65533;&#65533;p&#65533;X&#65533;&#65533;dfs&#65533;&#338;T&#65533;&#65533;
bool dfs(int v) {
  used[v] = true;
  for (int i = 0; i < G[v].size(); i++) {
    int u = G[v][i], w = match[u];
    if (w < 0 || !used[w] && dfs(w)) {
      match[v] = u;
      match[u] = v;
      return true;
    }
  }
  return false;
}

// &#65533;&#349443;O&#65533;&#65533;&#65533;t&#65533;&#781;&#337;&#65533;}&#65533;b&#65533;`&#65533;&#65533;&#65533;O&#65533;&#65533;&#1986;&#65533;
int bipartite_matching() {
  int res = 0;
  // memset(match,-1,sizeof(match));
  for (int i = 0; i < MAX_V; i++)
    match[i] = -1;
  for (int v = 0; v < V; v++) {
    if (match[v] < 0) {
      memset(used, 0, sizeof(used));
      if (dfs(v)) {
        res++;
      }
    }
  }
  return res;
}

int gcd(int a, int b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}

int main() {

  int n, m;
  vector<int> bs, rs;
  int b, r;

  while (cin >> m >> n && !(m == 0 && n == 0)) {
    for (int i = 0; i < MAX_V; i++)
      G[i].clear();
    bs.clear();
    rs.clear();

    V = n + m;
    for (int i = 0; i < m; i++) {
      cin >> b;
      bs.push_back(b);
    }
    for (int i = 0; i < n; i++) {
      cin >> r;
      rs.push_back(r);
    }
    for (int i = 0; i < rs.size(); i++) {
      for (int j = 0; j < bs.size(); j++) {
        int res = gcd(rs[i], bs[j]);
        if (res > 1)
          add_edge(i, j + rs.size());
      }
    }
    cout << bipartite_matching() << endl;
  }

  return 0;
}