Problem p00086 (C++) — buggy submission, verdict: Time Limit Exceeded

#define _CRT_SECURE_NO_WARNINGS 1
#include <algorithm>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define M_PI 3.141592
#define FOR(i, n) for (int i = 0; i < (int)n; i++)
#define FORI(i, k, n) for (int i = k; i < (int)n; i++)
#define toRad 2.0 * M_PI / 360.0
#define inin(x)                                                                \\
  int x;                                                                       \\
  cin >> x;
#define all(x) x.begin(), x.end()
#define debug(x) cout << #x << " :" << x << endl;
#define rep(i, n) for (int i = 0; i < (int)n; i++)
#define EPS 1e-12
#define pri_max 60000
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};

/*
bool memo[pri_max] = {};
vector<int> pri;
void calc()
{
        for (int i = 2; i < pri_max; i++)
        {
                if (memo[i] == false)
                {
                        pri.push_back(i);
                        for (int l = i; l < pri_max; l += i)
                        {
                                memo[l] = true;
                        }
                }
        }
}*/
double len(pdd a, pdd b) {
  return sqrt((b.first - a.first) * (b.first - a.first) +
              (b.second - a.second) * (b.second - a.second));
}

int main() {
  int a, b, c = -1;
  int m[110] = {};
  while (cin >> a >> b) {
    c = max(max(a, b), c);
    if (a == 0 && b == 0) {
      bool flag = true;
      for (int i = 3; i <= c; i++) {
        if (m[i] & 1) {
          cout << "NG" << endl;
          flag = false;
          break;
        }
      }
      if (flag && m[1] & 1 && m[2] & 1) {
        cout << "OK" << endl;
        flag = false;
      }
      if (flag)
        cout << "NG" << endl;
      memset(m, 0, sizeof m);
    } else {
      m[a]++;
      m[b]++;
    }
  }
}

Error: TLE

Fixed submission:

#define _CRT_SECURE_NO_WARNINGS 1
#include <algorithm>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define M_PI 3.141592
#define FOR(i, n) for (int i = 0; i < (int)n; i++)
#define FORI(i, k, n) for (int i = k; i < (int)n; i++)
#define toRad 2.0 * M_PI / 360.0
#define inin(x)                                                                \\
  int x;                                                                       \\
  cin >> x;
#define all(x) x.begin(), x.end()
#define debug(x) cout << #x << " :" << x << endl;
#define rep(i, n) for (int i = 0; i < (int)n; i++)
#define EPS 1e-12
#define pri_max 60000
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};

/*
bool memo[pri_max] = {};
vector<int> pri;
void calc()
{
        for (int i = 2; i < pri_max; i++)
        {
                if (memo[i] == false)
                {
                        pri.push_back(i);
                        for (int l = i; l < pri_max; l += i)
                        {
                                memo[l] = true;
                        }
                }
        }
}*/
double len(pdd a, pdd b) {
  return sqrt((b.first - a.first) * (b.first - a.first) +
              (b.second - a.second) * (b.second - a.second));
}

int hoge(int p, vector<pii> v) {
  if (p == 2 && v.size() == 0) {
    return 1;
  }
  if (v.size() == 0)
    return 0;
  int ans = 0;
  for (int i = 0; i < v.size(); i++) {
    if (ans)
      return ans;
    if (v[i].first == p || v[i].second == p) {
      vector<pii> t(v);
      t.erase(t.begin() + i);
      ans += hoge(p == v[i].first ? v[i].second : v[i].first, t);
    }
  }
  return ans;
}

int main() {
  while (1) {
    vector<pii> way;
    pii w;
    while (cin >> w.first >> w.second && w.first) {
      way.push_back(w);
    }
    if (way.size() == 0)
      break;
    cout << (hoge(1, way) ? "OK" : "NG") << endl;
  }
}