Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <cstring>
- #include <cmath>
- #include <vector>
- using namespace std;
- const int max_n = 15;
- int n;
- double len[max_n], p[max_n + max_n][2], dp[max_n + max_n][1 << max_n];
- vector< int > mask[max_n];
- inline double dist(double x1, double y1, double x2, double y2) {
- return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
- }
- int main() {
- int test = 1;
- while (scanf("%d", &n)) {
- if (n == 0)
- break;
- for (int i = 0;i < n;i++)
- scanf("%lf %lf %lf %lf", &p[i][0], &p[i][1], &p[n + i][0], &p[n + i][1]);
- for (int i = 0;i < n;i++)
- len[i] = dist(p[i][0], p[i][1], p[n + i][0], p[n + i][1]);
- for (int i = 0;i < n + n;i++) {
- for (int j = 0;j < (1 << n);j++) {
- dp[i][j] = 1e5;
- }
- }
- for (int i = 0;i < max_n;i++)
- mask[i].clear();
- for (int i = 0;i < (1 << n);i++)
- mask[__builtin_popcount(i)].push_back(i);
- for (int i = 0;i < n;i++)
- dp[i][1 << i] = dp[n + i][1 << i] = len[i];
- for (int i = 2;i <= n;i++) {
- for (int j = 0;j < mask[i].size();j++) {
- int m = mask[i][j];
- for (int k = 0;k < n + n;k++) {
- int q = (k < n)? k: k - n;
- if ((m & (1 << q)) == 0)
- continue;
- int o = (k < n)? k + n: k - n;
- for (int l = 0;l < n + n;l++) {
- int d = (l < n)? l: l - n;
- if (d == q || (m & (1 << d)) == 0)
- continue;
- dp[k][m] = min(dp[k][m], dp[l][m ^ (1 << q)] + dist(p[l][0], p[l][1], p[o][0], p[o][1]) + len[min(k, o)]);
- }
- }
- }
- }
- double ans = 1e5;
- for (int i = 0;i < n + n;i++)
- ans = min(ans, dp[i][(1 << n) - 1]);
- printf("Case %d: %.5lf\n", test++, ans);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement