Advertisement
Gustavo_Inzunza

FormingQuizTeams

May 25th, 2013
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.18 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cmath>
  4. #include <vector>
  5. #include <stdio.h>
  6. #include <string.h>
  7. using namespace std;
  8. pair<double,double> Coordenadas[17];
  9. int mascara,N;
  10. double memo[1<<17];
  11. bool know[1<<17];
  12. double recursion2(int mask)
  13. {
  14.     if(know[mask])
  15.         return memo[mask];
  16.     double & mejor = memo[mask]=10e20;
  17.     know[mask]=true;
  18.     for (int i0 = 0; i0 < 2*N; i0++)
  19.         if (!(mask & (1<<i0))) // si esta libre i0
  20.             for (int i1 = i0+1; i1 < 2*N; i1++)
  21.                 if (!(mask & (1<<i1)))// si esta libre i1
  22.                 {
  23.                    double sol=hypot(Coordenadas[i0].first-Coordenadas[i1].first, Coordenadas[i0].second-Coordenadas[i1].second);
  24.                    if((mask | 1<<i0 | 1 <<i1)!=(1<<(2*N+1))-1)
  25.                         sol+=recursion2(mask | (1<<i0) | (1<<i1));
  26.                    if (sol < mejor)
  27.                         mejor = sol;
  28.                 }
  29.     return mejor;
  30. }
  31. int main()
  32. {
  33.     char nombres[30];int cont=0;
  34.     while(scanf("%d",&N))
  35.     {
  36.         if(!N)
  37.             break;
  38.         for (int i = 0; i < 2*N; ++i)
  39.             scanf("%s %lf %lf",nombres,&Coordenadas[i].first,&Coordenadas[i].second);
  40.         mascara=(1<<2*N);
  41.         memset(know,0,sizeof(know));
  42.         printf("Case %d: %.2lf\n",++cont,recursion2(mascara));
  43.     }
  44.    
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement