๐Ÿ•๏ธ ICPC Sinchon/Backtracking

[BOJ S2][C++] ๋ฐฑ์ค€ 10971๋ฒˆ: ์™ธํŒ์› ์ˆœํšŒ 2

์„ ๋‹ฌ 2022. 9. 27. 03:53
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/10971

 

10971๋ฒˆ: ์™ธํŒ์› ์ˆœํšŒ 2

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤ 10) ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๋น„์šฉ ํ–‰๋ ฌ์ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ–‰๋ ฌ์˜ ์„ฑ๋ถ„์€ 1,000,000 ์ดํ•˜์˜ ์–‘์˜ ์ •์ˆ˜์ด๋ฉฐ, ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” 0์ด ์ฃผ์–ด์ง„๋‹ค. W[i][j]๋Š” ๋„์‹œ i์—์„œ j

www.acmicpc.net

 

๋ฌธ์ œ

์™ธํŒ์› ์ˆœํšŒ ๋ฌธ์ œ๋Š” ์˜์–ด๋กœ Traveling Salesman problem (TSP) ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋ฌธ์ œ๋กœ computer science ๋ถ„์•ผ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ทจ๊ธ‰๋˜๋Š” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ณ€์ข… ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋‚˜, ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ์˜ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋Š” ๋„์‹œ๋“ค์ด ์žˆ๊ณ , ๋„์‹œ๋“ค ์‚ฌ์ด์—๋Š” ๊ธธ์ด ์žˆ๋‹ค. (๊ธธ์ด ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค) ์ด์ œ ํ•œ ์™ธํŒ์›์ด ์–ด๋Š ํ•œ ๋„์‹œ์—์„œ ์ถœ๋ฐœํ•ด N๊ฐœ์˜ ๋„์‹œ๋ฅผ ๋ชจ๋‘ ๊ฑฐ์ณ ๋‹ค์‹œ ์›๋ž˜์˜ ๋„์‹œ๋กœ ๋Œ์•„์˜ค๋Š” ์ˆœํšŒ ์—ฌํ–‰ ๊ฒฝ๋กœ๋ฅผ ๊ณ„ํšํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋‹จ, ํ•œ ๋ฒˆ ๊ฐ”๋˜ ๋„์‹œ๋กœ๋Š” ๋‹ค์‹œ ๊ฐˆ ์ˆ˜ ์—†๋‹ค. (๋งจ ๋งˆ์ง€๋ง‰์— ์—ฌํ–‰์„ ์ถœ๋ฐœํ–ˆ๋˜ ๋„์‹œ๋กœ ๋Œ์•„์˜ค๋Š” ๊ฒƒ์€ ์˜ˆ์™ธ) ์ด๋Ÿฐ ์—ฌํ–‰ ๊ฒฝ๋กœ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์„ ๋“ค์ด๋Š” ์—ฌํ–‰ ๊ณ„ํš์„ ์„ธ์šฐ๊ณ ์ž ํ•œ๋‹ค.

๊ฐ ๋„์‹œ๊ฐ„์— ์ด๋™ํ•˜๋Š”๋ฐ ๋“œ๋Š” ๋น„์šฉ์€ ํ–‰๋ ฌ W[i][j]ํ˜•ํƒœ๋กœ ์ฃผ์–ด์ง„๋‹ค. W[i][j]๋Š” ๋„์‹œ i์—์„œ ๋„์‹œ j๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ๋น„์šฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋น„์šฉ์€ ๋Œ€์นญ์ ์ด์ง€ ์•Š๋‹ค. ์ฆ‰, W[i][j] ๋Š” W[j][i]์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ๋„์‹œ๊ฐ„์˜ ๋น„์šฉ์€ ์–‘์˜ ์ •์ˆ˜์ด๋‹ค. W[i][i]๋Š” ํ•ญ์ƒ 0์ด๋‹ค. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ ๋„์‹œ i์—์„œ ๋„์‹œ j๋กœ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์œผ๋ฉฐ ์ด๋Ÿด ๊ฒฝ์šฐ W[i][j]=0์ด๋ผ๊ณ  ํ•˜์ž.

N๊ณผ ๋น„์šฉ ํ–‰๋ ฌ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์„ ๋“ค์ด๋Š” ์™ธํŒ์›์˜ ์ˆœํšŒ ์—ฌํ–‰ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤ 10) ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๋น„์šฉ ํ–‰๋ ฌ์ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ–‰๋ ฌ์˜ ์„ฑ๋ถ„์€ 1,000,000 ์ดํ•˜์˜ ์–‘์˜ ์ •์ˆ˜์ด๋ฉฐ, ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” 0์ด ์ฃผ์–ด์ง„๋‹ค. W[i][j]๋Š” ๋„์‹œ i์—์„œ j๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ๋น„์šฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

ํ•ญ์ƒ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์™ธํŒ์›์˜ ์ˆœํšŒ์— ํ•„์š”ํ•œ ์ตœ์†Œ ๋น„์šฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

40% ์—์„œ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค ๊ฐ€ ๋‚˜์˜ค๋ฉด...
w[i][j]๊ฐ€ 0์ธ๊ฒฝ์šฐ i์—์„œ j๋กœ ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋Š” ์ ์„ ๊ตฌํ˜„ํ•ด์ฃผ์ž...

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n;
vector<vector<int>> input;
vector<bool> isVisit;  // ์ง€์—ญ i์˜ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
vector<int> cost;  // ๊ฐ€๋Šฅํ•œ ์ด๋™ ๋น„์šฉ๋“ค

void recur(int start, int cur, int cnt, int sum){
    // n๊ฐœ ์ง€์—ญ์„ ์ „๋ถ€ ๋ฐฉ๋ฌธํ–ˆ๊ณ , ์ถœ๋ฐœ์ง€๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด
    if(cnt==n && input[cur][start]!=0) {
        sum += input[cur][start];
        cost.push_back(sum);
        return;
    }
    
    for(int i=0; i<n; i++) { // ๋‹ค์Œ ํ–‰์„ ์ง€ ์ฐพ๊ธฐ
        if(isVisit[i] || input[cur][i]==0)  // ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ๊ฑฐ๋‚˜ ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด ํŒจ์Šค
            continue;
        isVisit[i] = true;
        recur(start, i, cnt+1, sum+input[cur][i]);
        isVisit[i] = false;
    }
}

int solution() {
    for(int i=0; i<n; i++) {
        isVisit[i] = true;
        recur(i,i,1,0);
        isVisit[i] = false;
    }
    
    sort(cost.begin(), cost.end());
    int minCost = cost[0];
    
    return minCost;
}

int main() {
    cin >> n;
    input.assign(n, vector<int>(n,0));
    isVisit.assign(n, false);
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            cin >> input[i][j];

    cout << solution();
    
    return 0;
}

/*
 */
๋ฐ˜์‘ํ˜•