티스토리 뷰

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;
}

'PS > BOJ C++' 카테고리의 다른 글

1010번 - 다리 놓기  (0) 2022.02.20
1325번 - 효율적인 해킹  (0) 2022.02.13
2563번 - 색종이  (0) 2022.02.11
10866번 - 덱  (0) 2022.02.07
1987번 - 알파벳  (0) 2022.01.30
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함