Ranking (as of 2014-10-17): 80 out of 310
Language: C++
/* UVa 10724 - Road Construction To build using Visual Studio 2012: cl -EHsc -O2 UVa_10724_Road_Construction.cpp */ #include <iostream> #include <vector> #include <algorithm> #include <cmath> #include <limits> using namespace std; const double infinite = numeric_limits<int>::max(), epsilon = numeric_limits<double>::epsilon(); struct point { double x_, y_; }; double euclidean_distance(const point& a, const point& b) { double dx = a.x_ - b.x_, dy = a.y_ - b.y_; return sqrt(dx * dx + dy * dy); } int main() { while (true) { int N, M; cin >> N >> M; if (!N && !M) break; vector<point> points(N + 1); for (int i = 1; i <= N; i++) cin >> points[i].x_ >> points[i].y_; vector< vector<bool> > roads(N + 1, vector<bool>(N + 1, false)); vector< vector<double> > matrix(N + 1, vector<double>(N + 1, infinite)); for (int i = 1; i <= N; i++) matrix[i][i] = 0.0; while (M--) { int i, j; cin >> i >> j; roads[i][j] = roads[j][i] = true; matrix[i][j] = matrix[j][i] = euclidean_distance(points[i], points[j]); } // apply Floyd-Warshall all-pairs shortest path algorithm for (int k = 1; k <= N; k++) for (int i = 1; i <= N; i++) for (int j = 1; j <= N; j++) if (matrix[i][k] + matrix[k][j] < matrix[i][j]) matrix[i][j] = matrix[i][k] + matrix[k][j]; double max_cuv = 1.0; int max_u, max_v; for (int u = 1; u < N; u++) for (int v = u + 1; v <= N; v++) { if (roads[u][v]) continue; double cuv = 0.0, duv = euclidean_distance(points[u], points[v]); for (int i = 1; i <= N; i++) for (int j = 1; j <= N; j++) { double d = matrix[i][j] - min(matrix[i][u] + matrix[v][j] + duv, matrix[i][v] + matrix[u][j] + duv); if (d > epsilon) cuv += d; } if (cuv - 1.0 > epsilon && cuv - max_cuv > epsilon) { max_cuv = cuv; max_u = u; max_v = v; } } if (max_cuv - 1.0 > epsilon) cout << max_u << ' ' << max_v << endl; else cout << "No road required\n"; } return 0; }
No comments:
Post a Comment