Shortest Hamiltonian cycle (TSP) in O(2^N * N^2)

import java.util.*;

public class ShortestHamiltonianCycle {

  public static int getShortestHamiltonianCycle(int[][] dist) {
    int n = dist.length;
    int[][] dp = new int[<< n][n];
    for (int[] d : dp)
      Arrays.fill(d, Integer.MAX_VALUE / 2);
    dp[1][00;
    for (int mask = 1; mask < << n; mask += 2) {
      for (int i = 1; i < n; i++) {
        if ((mask & << i!= 0) {
          for (int j = 0; j < n; j++) {
            if ((mask & << j!= 0) {
              dp[mask][i= Math.min(dp[mask][i], dp[mask ^ (<< i)][j+ dist[j][i]);
            }
          }
        }
      }
    }
    int res = Integer.MAX_VALUE;
    for (int i = 1; i < n; i++) {
      res = Math.min(res, dp[(<< n1][i+ dist[i][0]);
    }

    // reconstruct path
    int cur = (<< n1;
    int[] order = new int[n];
    int last = 0;
    for (int i = n - 1; i >= 1; i--) {
      int bj = -1;
      for (int j = 1; j < n; j++) {
        if ((cur & << j!= && (bj == -|| dp[cur][bj+ dist[bj][last> dp[cur][j+ dist[j][last])) {
          bj = j;
        }
      }
      order[i= bj;
      cur ^= << bj;
      last = bj;
    }
    System.out.println(Arrays.toString(order));
    return res;
  }

  // Usage example
  public static void main(String[] args) {
    int[][] dist = { { 0110110 }101010}101001}1101010 },
        101110} };
    System.out.println(== getShortestHamiltonianCycle(dist));
  }
}
Comments