Problem p00596 (C++) — buggy submission, verdict: Runtime Error

#define _USE_MATH_DEFINES
#define INF 0x3f3f3f3f
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <iostream>
#include <limits>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>

using namespace std;

typedef long long ll;
typedef pair<int, int> P;

static const double EPS = 1e-8;

static const int tx[] = {0, 1, 0, -1};
static const int ty[] = {-1, 0, 1, 0};

class Domino {
private:
  int _head;
  int _tail;

public:
  Domino(int head, int tail) {
    _head = head;
    _tail = tail;
  }

  int detect_connect_pattern(Domino d) {
    int res = 0;
    if (d.get_head() == _head) {
      return (res | (1 << 0));
    }
    if (d.get_head() == _tail) {
      return (res | (1 << 1));
    }
    if (d.get_tail() == _head) {
      return (res | (1 << 2));
    }
    if (d.get_tail() == _tail) {
      return (res | (1 << 3));
    }
    return res;
  }

  Domino connect(Domino d, int pattern) {
    if (pattern == (1 << 0)) {
      return Domino(d.get_tail(), _tail);
    }
    if (pattern == (1 << 1)) {
      return Domino(d.get_tail(), _head);
    }
    if (pattern == (1 << 2)) {
      return Domino(d.get_head(), _tail);
    }
    if (pattern == (1 << 3)) {
      return Domino(d.get_head(), _head);
    }
    return *this;
  }

  int get_head() const { return _head; }

  int get_tail() const { return _tail; }
};

bool dp[1 << 22];

bool dfs(Domino &current_state, int visited, const vector<Domino> &dominos) {
  if (dp[visited])
    return false;
  if (visited == (1 << dominos.size()) - 1) {
    return true;
  }

  int res = false;
  for (int i = 0; i < dominos.size(); i++) {

    if (visited & (1 << i))
      continue;
    int pattern;
    if ((pattern = current_state.detect_connect_pattern(dominos[i])) == 0)
      continue;
    Domino next = current_state.connect(dominos[i], pattern);
    res |= dfs(next, visited | (1 << i), dominos);
    dp[visited | (1 << i)] = true;
  }
  return res;
}

int main() {
  int n;
  while (~scanf("%d", &n)) {
    vector<Domino> dominos;
    memset(dp, false, sizeof(dp));

    int same_head_tail = 0;
    for (int i = 0; i < n; i++) {
      char domino[8];
      scanf("%s", domino);
      if (domino[0] - '0' == domino[1] - '0') {
        same_head_tail |= (1 << (domino[1] - '0'));
        continue;
      }
      dominos.push_back(Domino(domino[0] - '0', domino[1] - '0'));
    }

    bool same_check = true;
    for (int num = 0; num <= 6; num++) {
      if (same_head_tail & (1 << num)) {
        bool isok = false;
        for (int i = 0; i < dominos.size(); i++) {
          if (dominos[i].get_tail() == num || dominos[i].get_head() == num) {
            isok = true;
          }
        }
        if (!isok) {
          same_check = false;
          break;
        }
      }
    }

    bool travel_check = false;
    travel_check = dfs(dominos[0], (1 << 0), dominos);
    printf("%s\\n", ((same_check && travel_check) || (n == 1)) ? "Yes" : "No");
  }
}

Error: 0

Fixed submission:

#include <cstring>
#include <iostream>
using namespace std;
bool check();
int map[11][11], v[1001], g[7], vis[7], t[7];
int main() {
  int n, x;
  while (cin >> n) {
    for (int i = 0; i <= 6; i++) {
      g[i] = 0;
      t[i] = 0;
    }
    for (int i = 0; i <= 6; i++)
      for (int j = 0; j <= 6; j++)
        map[i][j] = 0;
    for (int i = 1; i <= n; i++) {
      cin >> x;
      int x1 = x / 10;
      int x2 = x % 10;
      t[x1]++;
      t[x2]++;
      if (x1 != x2) {
        g[x1]++;
        g[x2]++;
        map[x1][x2] = 1;
        map[x2][x1] = 1;
      }
    }
    if (check()) {
      int l = 0;
      for (int i = 0; i <= 6; i++)
        if (g[i] % 2 != 0)
          l++;
      if (l == 0 || l == 2)
        cout << "Yes" << endl;
      else
        cout << "No" << endl;
    } else
      cout << "No" << endl;
  }
}

bool check() {
  int l = 1, r = 1;
  memset(v, 0, sizeof(v));
  memset(vis, 0, sizeof(vis));
  while (g[l] == 0)
    l++;
  v[1] = l;
  vis[l] = 1;
  for (int i = 0; i <= 6; i++)
    if (map[l][i] == 1) {
      r++;
      v[r] = i;
      vis[i] = 1;
    }
  int x;
  while (l < r) {
    x = v[++l];
    for (int i = 0; i <= 6; i++)
      if (vis[i] == 0 && map[x][i] == 1) {
        vis[i] = 1;
        v[++r] = i;
      }
  }
  for (int i = 0; i <= 6; i++)
    if (vis[i] == 0 && t[i])
      return 0;
  return 1;
}