๐ ์ธํ์ ์ํ (Treveling Salesman Problem)
- ์ฌ์ง์ด ์์นํ๋ ๋
ธ๋์์ ์ถ๋ฐํ์ฌ ๋ค๋ฅธ๋
ธ๋๋ฅผ ๊ฐ๊ฐ ํ๋ฒ์ฉ๋ง ๋ฐฉ๋ฌธํ๊ณ ๋ค์ ์๊ธฐ ๋์๋ก ๋์์ค๋ ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก ์ฐพ๋ ๋ฌธ์
- ์์ด ์๋ ๊ฐ์ค์น๊ฐ ์๋ ๋ฐฉํฅ์ฑ ๊ทธ๋ํ ๋์
โพ DP ๊ธฐ๋ฐ ์ ๊ทผ
- ์๊ฐ ๋ณต์ก๋ : O(n^2 * 2^n)
- ๊ณต๊ฐ ๋ณต์ก๋ : O(n^2^n)
โพ ๋นํธ๋ง์คํฌ๋ฅผ ์ด์ฉํ ์งํฉ ํํ
- ์ด๋ฏธ ๋ฐฉ๋ฌธํ๋ ๋์๋ฅผ ์ฌ๋ฐฉ๋ฌธํ๋ฉด ์๋๋๊น ์ฒดํฌ ํ์
- ๋ฐฉ๋ฌธ์ํ๋ ํ๋์ integer ๋ณ์๋ก ํํํ๊ณ ๋นํธ๋ง์คํฌ์ shift์ฐ์ฐ๊ณผ OR ์ฐ์ฐ์ ์ด์ฉํด์ ํํ
๐ฌ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
static int[][] arr = new int[n][n];
static int[][] dp = new int[n][(1 << n) - 1];
private static int tsp(int node, int visit){
if(visit == (1 << n) - 1){
if(arr[node][0] == 0) return INF;
return arr[node][0];
}
if(dp[node][visit] != INF)
return dp[node][visit];
for(int i = 0 ; i < n; i++){
int next = visit | (1 << i);
if(arr[node][i] == 0 || (visit & (1 << i)) != 0) continue;
dp[node][visit] = Math.min(dp[node][visit], tsp(i, next) + arr[node][i]);
}
return dp[node][visit];
}