본문 바로가기

PS

[ 백준 / C++ ] 10971 : 외판원 순회 2

[ 문제 ]

 

 

10971번: 외판원 순회 2

첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j

www.acmicpc.net

 

[ 접근방법 ]

 

흔한 백트래킹 문제다.

 

0번 도시에서 출발하여 다시 되돌아오는 비용을 일일히 비교한다.

 

[ 소스코드 ]

 

#include <iostream>

using namespace std;

int n, tsp[11][11], ans = 10000000;
bool chk[11];

void f(int idx, int x, int cnt){
    if(idx == n){
        if(!tsp[x][0]) return;
        cnt += tsp[x][0];
        ans = ans > cnt ? cnt : ans;
        return;
    }

    for(int i = 1; i < n; i++){
        if(!tsp[x][i] || chk[i])continue;

        chk[i] = true;
        f(idx + 1, i, cnt + tsp[x][i]);
        chk[i] = false;
    }
    
    return;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for(int i = 0; i < n; i++)for(int j = 0; j < n; j++)cin >> tsp[i][j];

    f(1, 0, 0);

    cout << ans;

    return 0;
}

'PS' 카테고리의 다른 글

[ 백준 / C++ ] 18111 : 마인크래프트  (0) 2024.04.18
[ 백준 / C++ ] 11758 : CCW  (0) 2024.04.17
[ 백준 / C++ ] 1253 : 좋다  (0) 2024.04.16
[ 백준 / C++ ] 16486 : 운동장 한 바퀴  (0) 2024.04.12
[ 백준 / C++ ] 9465 : 스티커  (0) 2024.04.11