BOJ

백준 10971 - 외판원 순회 2

yanJuicy 2020. 4. 26. 19:25
반응형

문제

 

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

 

 

풀이

 

모든 도시를 방문하고, 도시의 방문 순서를 다르게 하는 문제이다. 도시의 수는 최대 10개이다. 그러므로 가능한 방문 순서의 수는 10! 이 되고, 이를 순열을 이용해 나타낸다.

 

d 배열을 이용해 도시를 저장하고, next_permutation() 함수를 이용해 d 배열의 가능한 순열을 만든다.

W[i][j]가 i 에서 j 로 가는 비용을 나타내므로, W[ d[i] ][ d[i+1] ] 을 이용하면 각각의 d 배열의 순열에서 도시 방문의 비용을 알 수 있다.

 

W[ d[i] ][ d[i+1] ] = 0 일 경우 d[i] 에서 d[i+1]로 갈 수 없는 경우이므로, 이 때는 비용을 구할 수 없다.

 

 

코드

 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int N;
int W[10][10];
int d[10];
int result = 987654321;
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
 
    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++)
        d[i] = i;
 
    do
    {
        int sum = 0;
        bool ok = true;
        for (int i=0; i<N-1; i++)
        {
            if (W[d[i]][d[i+1]])
                sum += W[d[i]][d[i+1]];
            else
                ok = false;
        }
 
        if (W[d[N-1]][d[0]])
            sum += W[d[N-1]][d[0]];
        else
            ok = false;
 
        if (ok && result > sum)
            result = sum;
    } while (next_permutation(d+1, d+N));
 
    cout << result;
 
    return 0;
}
 
 
cs
반응형

'BOJ' 카테고리의 다른 글

백준 8895 - 막대 배치  (0) 2020.10.06
백준 6603 - 로또  (0) 2020.04.30
백준 1939 - 중량 제한  (0) 2020.04.18
백준 14499 - 주사위 굴리기  (0) 2020.04.15
백준 1517 - 버블 소트  (0) 2020.04.14