Advertisement
SuitNdtie

Salesman

May 27th, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.05 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<utility>
  3. using namespace std;
  4. int const N = 18;
  5. int n;
  6.  
  7. int dist[N][N];
  8.  
  9. int cd(pair<int,int> a,pair<int,int > b){
  10.     return (a.first - b.first)*(a.first - b.first) + (a.second - b.second)*(a.second - b.second);
  11. }
  12.  
  13. int min(int a,int b){
  14.     return (a < b ? a : b);
  15. }
  16.  
  17. int dp[N][(1<<N)];
  18.  
  19. int cal(int now , int bit){
  20.     if(bit == (1<<n) - 1){
  21.         return dist[now][0];
  22.     }
  23.     if(dp[now][bit] != -1)return dp[now][bit];
  24.     int ans = 1e9;
  25.     for(int i = 0 ; i < n ; i ++){
  26.         if(!(bit&(1<<i)) && i != now){ //not visitted
  27.             ans = min(ans,cal(i,(bit|(1<<i))) + dist[now][i]);
  28.         }
  29.     }
  30. //  printf("Test (%d,%d) : %d\n",now,bit,ans);
  31.     return dp[now][bit] = ans;
  32. }
  33.  
  34. int main()
  35. {
  36.     for(int i = 0 ; i < N ; i ++)for(int j = 0 ; j < (1<<N) ; j ++)dp[i][j] = -1;
  37.     scanf("%d ",&n);
  38.     pair<int,int> pos[n];
  39.     for(int i = 0 ; i < n; i ++){
  40.         scanf("%d %d",&pos[i].first , &pos[i].second);
  41.     }
  42.     for(int i = 0 ; i < n ; i ++){
  43.         for(int j = 0 ; j < n ; j ++){
  44.             dist[i][j] = cd(pos[i],pos[j]);
  45.         }
  46.     }
  47.  
  48.     printf("%d",cal(0,1));
  49.     return 0;
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement