Пример #1
0
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;
}
Пример #2
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);
	}