tuple<ve, ValueT> solve(ve& edges, int nodes) {
    sort(edges.begin(), edges.end(), edge_compare);
    ve tree;
    DisjointSet ds(nodes);
    ValueT sum = 0;
    for (Edge e : edges) {
        if (!ds.sameSet(e.u, e.v)) {
            ds.join(e.u, e.v);
            tree.push_back(e);
            sum += e.w;
        } else if (tree.size() == nodes - 1) {
            break;
        }
    }
    return tuple<ve, ValueT>{tree, sum};
}
示例#2
0
// Chinese remainder theorem: find z such that
// z % x[i] = a[i] for all i.  Note that the solution is
// unique modulo M = lcm_i (x[i]). Return (z,M). On failure, M = -1.
pii chinese_remainder_theorem(const ve<int> &x, const ve<int> &a) {
  pii ret = make_pair(a[0], x[0]);
  for (int i = 1; i < x.size(); i++) {
    ret = chinese_remainder_theorem(ret.second, ret.first, x[i], a[i]);
    if (ret.second == -1) break;
  }
  return ret;
}
示例#3
0
void printEdges(ve & edges){
    for (int i = 0; i < edges.size(); i++){
        edge e = edges[i];
        printf("Edge to %i of length %f\n", e.first, e.second);
    }
}