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

#include <bits/stdc++.h>

using namespace std;

#define all(c) ((c).begin()), ((c).end())
#define dump(c) cerr << "> " << #c << " = " << (c) << endl;
#define iter(c) __typeof((c).begin())
#define tr(i, c) for (iter(c) i = (c).begin(); i != (c).end(); i++)
#define REP(i, a, b) for (int i = a; i < (int)(b); i++)
#define rep(i, n) REP(i, 0, n)
#define mp make_pair
#define fst first
#define snd second
#define pb push_back

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<string> vs;
typedef pair<int, int> pii;

const int INF = 1 << 29;
const double EPS = 1e-10;

double zero(double d) { return d < EPS ? 0.0 : d; }

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  return os << '(' << p.first << ',' << p.second << ')';
}

template <typename T> ostream &operator<<(ostream &os, const vector<T> &a) {
  os << '[';
  rep(i, a.size()) os << (i ? " " : "") << a[i];
  return os << ']';
}

// to avoid error on mingw
string toString(int i) {
  stringstream ss;
  ss << i;
  return ss.str();
}

const int MOD = 1000000007;
// a^k
ll fpow(ll a, ll k, int M) {
  ll res = 1ll;
  ll x = a;
  while (k != 0) {
    if ((k & 1) == 1)
      res = (res * x) % M;
    x = (x * x) % M;
    k >>= 1;
  }
  return res;
}

class UnionFind {
private:
  vi par;
  vi rank;

  int find(int x) {
    if (par[x] == x)
      return x;
    else
      return par[x] = find(par[x]);
  }

public:
  UnionFind(int n) {
    rep(i, n) {
      par.push_back(i);
      rank.push_back(0);
    }
  }

  void unite(int x, int y) {
    x = find(x);
    y = find(y);
    if (x == y)
      return;

    if (rank[x] < rank[y])
      par[x] = y;
    else {
      par[y] = x;
      if (rank[x] == rank[y])
        rank[x]++;
    }
  }

  bool same(int x, int y) { return find(x) == find(y); }
};

struct edge {
  int from, to;
  double cost;
};
bool comp(const edge &e1, const edge &e2) { return e1.cost < e2.cost; }
ll twice(int t) { return t * t; }

int main() {
  cout.setf(ios::fixed, ios::floatfield);
  cout.precision(8);
  ios_base::sync_with_stdio(false);

  int N, M;
  cin >> N >> M;

  vector<pii> piles(N);
  rep(i, N) cin >> piles[i].first >> piles[i].second;

  vector<edge> edges(M);
  double totalCost = 0.0;
  rep(i, M) {
    int p, q;
    cin >> p >> q;
    --p, --q;
    double cost = sqrt(twice(piles[p].first - piles[q].first) +
                       twice(piles[p].second - piles[q].second));
    edges[i] = edge{p, q, -cost};
    totalCost += cost;
  }

  // kruscal
  sort(all(edges), comp);
  UnionFind uf(N);

  double res = 0;

  tr(it, edges) {
    if (!uf.same(it->from, it->to)) {
      uf.unite(it->from, it->to);
      res += it->cost;
    }
  }

  cout << totalCost - (-res) << endl;

  return 0;
}

Error: WA

Fixed submission:

#include <bits/stdc++.h>

using namespace std;

#define all(c) ((c).begin()), ((c).end())
#define dump(c) cerr << "> " << #c << " = " << (c) << endl;
#define iter(c) __typeof((c).begin())
#define tr(i, c) for (iter(c) i = (c).begin(); i != (c).end(); i++)
#define REP(i, a, b) for (int i = a; i < (int)(b); i++)
#define rep(i, n) REP(i, 0, n)
#define mp make_pair
#define fst first
#define snd second
#define pb push_back

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<string> vs;
typedef pair<int, int> pii;

const int INF = 1 << 29;
const double EPS = 1e-10;

double zero(double d) { return d < EPS ? 0.0 : d; }

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  return os << '(' << p.first << ',' << p.second << ')';
}

template <typename T> ostream &operator<<(ostream &os, const vector<T> &a) {
  os << '[';
  rep(i, a.size()) os << (i ? " " : "") << a[i];
  return os << ']';
}

// to avoid error on mingw
string toString(int i) {
  stringstream ss;
  ss << i;
  return ss.str();
}

const int MOD = 1000000007;
// a^k
ll fpow(ll a, ll k, int M) {
  ll res = 1ll;
  ll x = a;
  while (k != 0) {
    if ((k & 1) == 1)
      res = (res * x) % M;
    x = (x * x) % M;
    k >>= 1;
  }
  return res;
}

class UnionFind {
private:
  vi par;
  vi rank;

  int find(int x) {
    if (par[x] == x)
      return x;
    else
      return par[x] = find(par[x]);
  }

public:
  UnionFind(int n) {
    rep(i, n) {
      par.push_back(i);
      rank.push_back(0);
    }
  }

  void unite(int x, int y) {
    x = find(x);
    y = find(y);
    if (x == y)
      return;

    if (rank[x] < rank[y])
      par[x] = y;
    else {
      par[y] = x;
      if (rank[x] == rank[y])
        rank[x]++;
    }
  }

  bool same(int x, int y) { return find(x) == find(y); }
};

struct edge {
  int from, to;
  double cost;
};
bool comp(const edge &e1, const edge &e2) { return e1.cost < e2.cost; }
ll twice(int t) { return t * t; }

int main() {
  cout.setf(ios::fixed, ios::floatfield);
  cout.precision(8);
  ios_base::sync_with_stdio(false);

  int N, M;
  cin >> N >> M;

  vector<pii> piles(N);
  rep(i, N) cin >> piles[i].first >> piles[i].second;

  vector<edge> edges(M);
  double totalCost = 0.0;
  rep(i, M) {
    int p, q;
    cin >> p >> q;
    --p, --q;
    double cost = sqrt(twice(piles[p].first - piles[q].first) +
                       twice(piles[p].second - piles[q].second));
    edges[i] = edge{p, q, -cost};
    totalCost += cost;
  }

  // kruscal
  sort(all(edges), comp);
  UnionFind uf(N);

  double res = 0;

  tr(it, edges) {
    if (!uf.same(it->from, it->to)) {
      uf.unite(it->from, it->to);
      cerr << it->cost << endl;
      res += it->cost;
    }
  }

  cerr << totalCost - (-res) << endl;

  return 0;
}