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

#include <algorithm>
#include <bits/stdc++.h>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <vector>

using namespace std;
typedef long long int lli;
typedef pair<lli, lli> pii;

class uf {
public:
  uf();
  uf(lli _n) { init(_n); }
  void init(lli _n) {
    n = _n;
    rank.resize(n);
    parent.resize(n);
    for (lli i = 0; i < n; i++) {
      rank[i] = 0;
      parent[i] = i;
    }
  }
  lli find(lli x) {
    if (x == parent[x])
      return x;
    else
      return parent[x] = find(parent[x]);
  }

  void unite(lli x, lli y) {
    x = find(x);
    y = find(y);
    if (x == y)
      return;
    if (rank[x] < rank[y]) {
      parent[x] = y;
    } else {
      parent[y] = x;
      if (rank[x] == rank[y])
        rank[x]++;
    }
  }
  bool same(lli x, lli y) { return find(x) == find(y); }

private:
  lli n;
  vector<lli> rank, parent;
};

struct edge {
  lli from, to, cost;
  bool operator<(const edge &e) const { return cost < e.cost; }
};

lli V, E;

lli kruskal(vector<edge> &es, vector<bool> &used) {
  sort(es.begin(), es.end());
  uf u(V);
  lli res = 0;
  for (lli i = 0; i < es.size(); i++) {
    edge &e = es[i];
    if (not u.same(e.from, e.to)) {
      u.unite(e.from, e.to);
      used[i] = true;
      res += e.cost;
    }
  }
  return res;
}

void dfs(vector<vector<edge>> &g, vector<vector<lli>> &mat, vector<bool> &used,
         int s, int v) {
  used[v] = true;
  for (int i = 0; i < g[v].size(); i++) {
    edge &e = g[v][i];
    if (used[e.to] == true)
      continue;
    mat[s][e.to] = max(mat[s][e.to], e.cost);
    mat[e.to][s] = max(mat[e.to][s], e.cost);
    dfs(g, mat, used, s, e.to);
  }
}

int main() {
  lli n, m, w, h, q;
  std::cin >> n >> m;
  // vector<vector<lli> > mat(n, vector<lli>(n, 0));
  V = n;
  vector<edge> e(m);
  vector<bool> used(m, false);
  for (lli i = 0; i < m; i++) {
    std::cin >> e[i].from >> e[i].to >> e[i].cost;
    // e[i].from--, e[i].to--;
  }
  lli cost = kruskal(e, used);
  vector<vector<edge>> g(n);
  for (lli i = 0; i < m; i++) {
    if (used[i] == true) {
      edge te = (edge){e[i].to, e[i].from, e[i].cost};
      g[e[i].from].emplace_back(e[i]);
      g[e[i].to].emplace_back(te);
      // mat[e[i].from][e[i].to] = e[i].cost;
      // mat[e[i].to][e[i].from] = e[i].cost;
    }
  }
  // for (int i = 0; i < n; i++) {
  //   vector<bool> used(n, false);
  //   dfs(g, mat, used, i, i);
  // }
  std::cout << cost << std::endl;
  // for (int i = 0; i < n; i++) {
  //   for (int j = 0; j < n; j++) {
  //     std::cout << mat[i][j] << " ";
  //   }
  //   std::cout << std::endl;
  // }
  // std::cin >> q;
  // vector<lli> s(q), t(q);
  // for (lli i = 0; i < q; i++) {
  //   std::cin >> s[i] >> t[i];
  //   std::cout << cost - mat[--s[i]][--t[i]] << std::endl;
  // }
  return 0;
}

Error: MLE

Fixed submission:

#include <algorithm>
#include <bits/stdc++.h>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <vector>

using namespace std;
typedef long long int lli;
typedef pair<lli, lli> pii;

class uf {
public:
  uf();
  uf(lli _n) { init(_n); }
  void init(lli _n) {
    n = _n;
    rank.resize(n);
    parent.resize(n);
    for (lli i = 0; i < n; i++) {
      rank[i] = 0;
      parent[i] = i;
    }
  }
  lli find(lli x) {
    if (x == parent[x])
      return x;
    else
      return parent[x] = find(parent[x]);
  }

  void unite(lli x, lli y) {
    x = find(x);
    y = find(y);
    if (x == y)
      return;
    if (rank[x] < rank[y]) {
      parent[x] = y;
    } else {
      parent[y] = x;
      if (rank[x] == rank[y])
        rank[x]++;
    }
  }
  bool same(lli x, lli y) { return find(x) == find(y); }

private:
  lli n;
  vector<lli> rank, parent;
};

struct edge {
  lli from, to, cost;
  bool operator<(const edge &e) const { return cost < e.cost; }
};

lli V, E;

lli kruskal(vector<edge> &es, vector<bool> &used) {
  sort(es.begin(), es.end());
  uf u(V);
  lli res = 0;
  for (lli i = 0; i < es.size(); i++) {
    edge &e = es[i];
    if (not u.same(e.from, e.to)) {
      u.unite(e.from, e.to);
      used[i] = true;
      res += e.cost;
    }
  }
  return res;
}

void dfs(vector<vector<edge>> &g, vector<vector<lli>> &mat, vector<bool> &used,
         int s, int v) {
  used[v] = true;
  for (int i = 0; i < g[v].size(); i++) {
    edge &e = g[v][i];
    if (used[e.to] == true)
      continue;
    mat[s][e.to] = max(mat[s][e.to], e.cost);
    mat[e.to][s] = max(mat[e.to][s], e.cost);
    dfs(g, mat, used, s, e.to);
  }
}

int main() {
  lli n, m, w, h, q;
  std::cin >> n >> m;
  vector<vector<lli>> mat(n, vector<lli>(n, 0));
  V = n;
  vector<edge> e(m);
  vector<bool> used(m, false);
  for (lli i = 0; i < m; i++) {
    std::cin >> e[i].from >> e[i].to >> e[i].cost;
    // e[i].from--, e[i].to--;
  }
  lli cost = kruskal(e, used);
  vector<vector<edge>> g(n);
  for (lli i = 0; i < m; i++) {
    if (used[i] == true) {
      edge te = (edge){e[i].to, e[i].from, e[i].cost};
      g[e[i].from].emplace_back(e[i]);
      g[e[i].to].emplace_back(te);
      mat[e[i].from][e[i].to] = e[i].cost;
      mat[e[i].to][e[i].from] = e[i].cost;
    }
  }
  for (int i = 0; i < n; i++) {
    vector<bool> used(n, false);
    dfs(g, mat, used, i, i);
  }
  std::cout << cost << std::endl;
  // for (int i = 0; i < n; i++) {
  //   for (int j = 0; j < n; j++) {
  //     std::cout << mat[i][j] << " ";
  //   }
  //   std::cout << std::endl;
  // }
  // std::cin >> q;
  // vector<lli> s(q), t(q);
  // for (lli i = 0; i < q; i++) {
  //   std::cin >> s[i] >> t[i];
  //   std::cout << cost - mat[--s[i]][--t[i]] << std::endl;
  // }
  return 0;
}