Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <stdio.h>
- #include <string.h>
- using namespace std;
- pair<double,double> Coordenadas[17];
- int mascara,N;
- double memo[1<<17];
- bool know[1<<17];
- double recursion2(int mask)
- {
- if(know[mask])
- return memo[mask];
- double & mejor = memo[mask]=10e20;
- know[mask]=true;
- for (int i0 = 0; i0 < 2*N; i0++)
- if (!(mask & (1<<i0))) // si esta libre i0
- for (int i1 = i0+1; i1 < 2*N; i1++)
- if (!(mask & (1<<i1)))// si esta libre i1
- {
- double sol=hypot(Coordenadas[i0].first-Coordenadas[i1].first, Coordenadas[i0].second-Coordenadas[i1].second);
- if((mask | 1<<i0 | 1 <<i1)!=(1<<(2*N+1))-1)
- sol+=recursion2(mask | (1<<i0) | (1<<i1));
- if (sol < mejor)
- mejor = sol;
- }
- return mejor;
- }
- int main()
- {
- char nombres[30];int cont=0;
- while(scanf("%d",&N))
- {
- if(!N)
- break;
- for (int i = 0; i < 2*N; ++i)
- scanf("%s %lf %lf",nombres,&Coordenadas[i].first,&Coordenadas[i].second);
- mascara=(1<<2*N);
- memset(know,0,sizeof(know));
- printf("Case %d: %.2lf\n",++cont,recursion2(mascara));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement