Advertisement
SuitNdtie

SMMR-170: Salesman

May 15th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.00 KB | None | 0 0
  1. #include<stdio.h>
  2. typedef long long int ll;
  3. ll const inf = 1e18;
  4. int start = 0;
  5. struct pos{
  6.     int I,J;
  7. };
  8.  
  9. ll dist(pos a,pos b){
  10.     return (a.I-b.I)*(a.I-b.I) + (a.J-b.J)*(a.J-b.J);
  11. }
  12.  
  13. int n;
  14. pos town[20];
  15. ll min(ll a,ll b){
  16.     return (a < b ? a : b);
  17. }
  18.  
  19. ll dp[20][1<<18];
  20.  
  21. ll TSP(int u,int visited){
  22. //  printf("Test (%d,%d)\n",u,visited);
  23.     if(visited == (1<<n)-1){ //visit all town
  24.         return (u == start ? 0 : inf);
  25.     }
  26.     if(dp[u][visited] != -1)return dp[u][visited];
  27.     ll ans = inf;
  28.     for(int i = 0 ; i < n ; i ++){
  29.         if((visited & (1<<i)) == 0){ // not visit
  30.         //  printf(" Test go to %d\n",i);
  31.             ans = min(ans,TSP(i,(visited | (1<<i))) + dist(town[u],town[i]));
  32.         }
  33.     }
  34. //  printf("Test (%d,%d) : %lld\n",u,visited,ans);
  35.     return dp[u][visited] = ans;
  36. }
  37.  
  38.  
  39.  
  40. int main()
  41. {
  42.     for(int i = 0 ; i < 20 ; i ++)for(int j = 0 ; j < 1<<18 ; j ++)dp[i][j] = -1;
  43.     scanf("%d",&n);
  44.     for(int i = 0 ; i < n ; i ++){
  45.         scanf("%lld %lld",&town[i].I,&town[i].J);
  46.     }
  47.     printf("%lld",TSP(start,0));
  48.     return 0;
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement