PS/BOJ C++

10971번 - 외판원 순회 2

zpqmdh 2022. 2. 13. 21: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

#include <iostream>
using namespace std;
int N;
int W[11][11];
bool check[11] = {false};
int ans = 987654321;

//출발 도시, 들린 도시의 개수, 현재 도시, 비용의 합
void dfs(int start, int cnt, int node, int sum)
{
    //모든 도시 들림 && 출발점 도착
    if(cnt == N && start == node)
    {
        if(sum < ans)
            ans = sum;
        return ;
    }
    for(int i=0; i<N; i++)
    {
        //연결되지 않은 경우
        if(W[node][i] == 0)
            continue;
        //방문하지 않음 && 길이 있음
        if(false == check[node] && W[node][i] > 0)
        {
            check[node] = true;
            sum += W[node][i];

            //이미 ans를 넘겼을 경우 탐색 X 
            if(sum <= ans)
                dfs(start, cnt+1, i, sum);

            check[node] = false;
            sum -= W[node][i];

        }
    }
}
int main()
{
    //TSP
    cin >> N;
    for(int i=0; i<N; i++)
    {
        for(int j=0; j<N; j++)
        {
            cin >> W[i][j];
        }
    }

    //각 정점 모두 출발점으로 선택해봄
    for(int i=0; i<N; i++)
    {
        dfs(i, 0, i, 0);
    }
    cout << ans << '\n';
    return 0;
}