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

#include <cstring>
#include <iostream>
#include <sstream>
// #include <fstream>

using namespace std;

int d[101];

int main() {
  //	cut here before submit
  //	freopen("testcase.patrol", "r", stdin);
  string str = "";
  memset(d, 0, sizeof(d));

  while (getline(cin, str)) {
    int a, b;
    stringstream ss(str);
    ss >> a >> b;

    if (a != 0 || b != 0) {
      ++d[a];
      ++d[b];
      continue;
    } // end if

    bool ng = false;

    if (d[1] % 2 == 0 || d[2] % 2 == 0) {
      ng = true;
    } // end if

    if (!ng) {
      for (int i = 3; i <= 100; ++i) {
        if (d[i] != 0 && d[i] % 2 == 1) {
          ng = true;
          break;
        } // end if
      }   // end if
    }     // end if

    cout << (ng ? "NG" : "OK") << endl;

    memset(d, 0, sizeof(d));

  } // end loop

  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cfloat>
#include <climits>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;

void disp_t(vector<vector<int>> t) {
  int size = t.size();
  int len = t[0].size();
  int i, j;

  for (i = 1; i < size; ++i) {
    for (j = 1; j < len; ++j) {
      cout << setw(2) << t[i][j];
    } // end for
    cout << endl;
  } // end for
}

bool check_table(vector<vector<int>> t) {
  int size = t.size();
  int len = t[0].size();
  int i, j;

  for (i = 1; i < size; ++i) {
    for (j = 1; j < len; ++j) {
      if (t[i][j] == 0) {
        continue;
      } else {
        return false;
      } // end if
    }   // end for
  }     // end for

  return true;
}

bool dfs(int s, int e, vector<vector<int>> &t) {

  if (s == e) {
    if (check_table(t)) {
      return true;
    } else {
      return false;
    } // end if
  }   // end if

  int size = t.size();
  int i;

  for (i = 0; i < size; ++i) {
    if (t[s][i] > 0) {
      //			cout << s << " --> " << i << endl;
      //			disp_t (t );
      --t[s][i];
      --t[i][s];
      if (dfs(i, e, t)) {
        return true;
      } // end if
      ++t[s][i];
      ++t[i][s];
    } // end if
  }   // end for

  return false;
}

bool search(int s, int e, vector<vector<int>> T) {
  vector<vector<int>> &t = T;

  if (dfs(s, e, t)) {
    return true;
  } // end if

  return false;
}

int main() {
  //	cut here before submit
  //	freopen("testcase.patrol", "r", stdin);
  string str = "";
  multimap<int, int> p;
  int max_n = 0;

  while (getline(cin, str)) {
    int a, b;
    stringstream ss(str);
    ss >> a >> b;
    max_n = max(max_n, a);
    max_n = max(max_n, b);
    if (a != 0 || b != 0) {
      p.insert(make_pair(a, b));
      continue;
    } // end if

    vector<vector<int>> T(max_n + 1, vector<int>(max_n + 1, 0));
    multimap<int, int>::iterator it = p.begin();
    for (; it != p.end(); ++it) {
      ++T[(*it).first][(*it).second];
      ++T[(*it).second][(*it).first];
    } // end for
    int i;
    int start = 1;
    int end = 2;

    //		disp_t (T );

    if (search(start, end, T)) {
      cout << "OK" << endl;
    } else {
      cout << "NG" << endl;
    } // end if

    max_n = 0;
    p.clear();
  } // end loop

  return 0;
}