// UVa 10397 - Connect the Campus
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <vector>
#include <queue>
#include <stdio.h>
#include <cmath>
using namespace std;
#define integer signed long long int
struct point {
integer x, y;
};
struct edge {
int i, j;
integer d;
};
bool operator <(edge a, edge b) {
return a.d > b.d;
}
integer dist(point p1, point p2) {
return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
}
vector<int> comp[751];
int c[751], count;
void fill(int a, int b) {
int cb = c[b];
for (int j = 0; j < comp[cb].size(); j++) {
c[comp[cb][j]] = c[a];
comp[c[a]].push_back(comp[cb][j]);
}
count++;
}
int main() {
int n;
while (cin >> n) {
point p[751];
for (int i = 1; i <= n; i++) {
cin >> p[i].x >> p[i].y;
c[i] = i;
comp[i].clear();
comp[i].push_back(i);
}
count = n;
int m;
cin >> m;
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
if (c[a] != c[b])
fill(a, b);
}
priority_queue<edge> q;
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++)
if (c[i] != c[j]) {
edge e = { i, j, dist(p[i], p[j]) };
q.push(e);
}
}
double sol = 0;
while (count != 1 && !q.empty()) {
edge e = q.top();
q.pop();
if (c[e.i] != c[e.j]) {
fill(e.i, e.j);
sol += sqrt(e.d * 1.0);
}
}
printf("%.2f\n", sol);
}
return 0;
}
Friday, July 24, 2015
UVa 10397 - Connect the Campus
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment