Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. const int max_n = 15;
  10.  
  11. int n;
  12. double len[max_n], p[max_n + max_n][2], dp[max_n + max_n][1 << max_n];
  13. vector< int > mask[max_n];
  14.  
  15. inline double dist(double x1, double y1, double x2, double y2) {
  16.     return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
  17. }
  18.  
  19. int main() {
  20.     int test = 1;
  21.     while (scanf("%d", &n)) {
  22.         if (n == 0)
  23.             break;
  24.         for (int i = 0;i < n;i++)
  25.             scanf("%lf %lf %lf %lf", &p[i][0], &p[i][1], &p[n + i][0], &p[n + i][1]);
  26.         for (int i = 0;i < n;i++)
  27.             len[i] = dist(p[i][0], p[i][1], p[n + i][0], p[n + i][1]);
  28.         for (int i = 0;i < n + n;i++) {
  29.             for (int j = 0;j < (1 << n);j++) {
  30.                 dp[i][j] = 1e5;
  31.             }
  32.         }
  33.         for (int i = 0;i < max_n;i++)
  34.             mask[i].clear();
  35.         for (int i = 0;i < (1 << n);i++)
  36.             mask[__builtin_popcount(i)].push_back(i);
  37.         for (int i = 0;i < n;i++)
  38.             dp[i][1 << i] = dp[n + i][1 << i] = len[i];
  39.         for (int i = 2;i <= n;i++) {
  40.             for (int j = 0;j < mask[i].size();j++) {
  41.                 int m = mask[i][j];
  42.                 for (int k = 0;k < n + n;k++) {
  43.                     int q = (k < n)? k: k - n;
  44.                     if ((m & (1 << q)) == 0)
  45.                         continue;
  46.                     int o = (k < n)? k + n: k - n;
  47.                     for (int l = 0;l < n + n;l++) {
  48.                         int d = (l < n)? l: l - n;
  49.                         if (d == q || (m & (1 << d)) == 0)
  50.                             continue;
  51.                         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)]);
  52.                     }
  53.                 }
  54.             }
  55.         }
  56.         double ans = 1e5;
  57.         for (int i = 0;i < n + n;i++)
  58.             ans = min(ans, dp[i][(1 << n) - 1]);
  59.         printf("Case %d: %.5lf\n", test++, ans);
  60.     }
  61.     return 0;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement