๐™๐™Ž๐™‹

uuuouuoยท2022๋…„ 7์›” 25์ผ
0
post-thumbnail

๐Ÿ“– ์™ธํŒ์› ์ˆœํšŒ (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);
            // 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];
	}

0๊ฐœ์˜ ๋Œ“๊ธ€