int main(int argc, char const *argv[]) { ios::sync_with_stdio(false); int t; Kruskal *K; cin >> t; for (int cs = 0; cs < t; ++cs) { int n; ll r; cin >> n >> r; VL x(n), y(n); K = new Kruskal(n); for (int i = 0; i < n; ++i) { cin >> x[i] >> y[i]; for (int j = 0; j < i; ++j) { K->addEdge(i, j, (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])); } } vector <pair <ll, PI>> mst; K->MST(&mst); int state = 1; double road = 0.0, rail = 0.0; for (auto e : mst) { if (e.x <= r * r) { road += sqrt(double(e.x)); } else { rail += sqrt(double(e.x)); state++; } } cout << "Case #" << cs + 1 << ": " << state << ' ' << int(road + 0.5) << ' ' << int(rail + 0.5) << endl; } return 0; }
void addEdge(int a, int b, int val) { if(a == v0 || b == v0) E0.push_back(T(val, a+b-v0));//a+b-v0即为另外一条边! else kr.addEdge(a, b, val); }