Problem p02367 (C++) — buggy submission, verdict: Memory Limit Exceeded

#include <algorithm>
#include <climits>
#include <iostream>
#include <vector>
using namespace std;

const int V_MAX = 100000;
const int E_MAX = 100000;

struct edge {
  int from;
  int to;
  bool operator<(const edge &right) const {
    return from == right.from ? to < right.to : from < right.from;
  }
};

vector<int> G[V_MAX];
bool used_v[V_MAX] = {};
// bool used_e[E_MAX][E_MAX]={};
vector<int> pre(V_MAX, INT_MAX);
vector<int> low(V_MAX, INT_MAX);
vector<edge> result;
int order;

void dfs(int s, int p) {
  if (used_v[s] == true) {
    return;
  }
  used_v[s] = true;
  pre[s] = order;
  low[s] = order;
  order++;
  for (int i = 0; i < G[s].size(); i++) {
    // used_e[s][G[s][i]]=true;
    if (!used_v[G[s][i]]) {
      dfs(G[s][i], s);
      low[s] = min(low[s], low[G[s][i]]);
    } else if (G[s][i] != p) {
      low[s] = min(low[s], pre[G[s][i]]);
    }
  }
  if (!(s == 0 && p == 0) && low[s] > pre[p]) {
    edge e;
    e.from = min(s, p);
    e.to = max(s, p);
    result.push_back(e);
  }
}

int main() {
  int V, E, s, t;
  cin >> V >> E;
  for (int i = 0; i < E; i++) {
    cin >> s >> t;
    G[s].push_back(t);
    G[t].push_back(s);
  }

  order = 0;
  dfs(0, 0);

  sort(result.begin(), result.end());
  for (int i = 0; i < result.size(); i++) {
    cout << result[i].from << " " << result[i].to << endl;
  }
  /*
  for(int i=0;i<V;i++){
          cout << pre[i] << " ";
  }
  cout << endl;

  for(int i=0;i<V;i++){
          cout << low[i] << " ";
  }
  */
  return 0;
}

Error: MLE

Fixed submission:

#include <algorithm>
#include <climits>
#include <iostream>
#include <vector>
using namespace std;

const int V_MAX = 10000;
const int E_MAX = 10000;

struct edge {
  int from;
  int to;
  bool operator<(const edge &right) const {
    return from == right.from ? to < right.to : from < right.from;
  }
};

vector<int> G[V_MAX];
bool used_v[V_MAX] = {};
bool used_e[E_MAX][E_MAX] = {};
vector<int> pre(V_MAX, INT_MAX);
vector<int> low(V_MAX, INT_MAX);
vector<edge> result;
int order;

void dfs(int s, int p) {
  if (used_v[s] == true) {
    return;
  }
  used_v[s] = true;
  pre[s] = order;
  low[s] = order;
  order++;
  for (int i = 0; i < G[s].size(); i++) {
    used_e[s][G[s][i]] = true;
    if (!used_v[G[s][i]]) {
      dfs(G[s][i], s);
      low[s] = min(low[s], low[G[s][i]]);
    } else if (!used_e[G[s][i]][s]) {
      low[s] = min(low[s], pre[G[s][i]]);
    }
  }
  if (!(s == 0 && p == 0) && low[s] > pre[p]) {
    edge e;
    e.from = min(s, p);
    e.to = max(s, p);
    result.push_back(e);
  }
}

int main() {
  int V, E, s, t;
  cin >> V >> E;
  for (int i = 0; i < E; i++) {
    cin >> s >> t;
    G[s].push_back(t);
    G[t].push_back(s);
  }

  order = 0;
  dfs(0, 0);

  sort(result.begin(), result.end());
  for (int i = 0; i < result.size(); i++) {
    cout << result[i].from << " " << result[i].to << endl;
  }
  /*
  for(int i=0;i<V;i++){
          cout << pre[i] << " ";
  }
  cout << endl;

  for(int i=0;i<V;i++){
          cout << low[i] << " ";
  }
  for (int i=0;i<V;i++){
          for (int j=0;j<V;j++){
                  cout << used_e[i][j] <<" " ;
          }
  }
  */
  return 0;
}