[BAEKJOON] 10971_외판원 순회 2_C언어

SW 업무 관련/백준

[BAEKJOON] 10971_외판원 순회 2_C언어

WillBe_ 2017. 7. 23. 23:34
https://www.acmicpc.net/problem/10971




풀이

경로를 탐색하는 탐색문제이다. 처음에 출발점이 안 주어져 있어서 모든 노드를 반복문으로 출발점으로 하여 탐색을 하였다. 그러나 문제에서는 마지막에 처음 출발한 경로로 다시 돌아와야 하기 때문에 모든 노드를 출발점으로 탐색할 필요가 없었다.


Ex)답이 1-2-3-4-1이라고 하면 나는


for(int i=1;i<=4;i++)

search();


이런식으로 모든 노드를 출발점으로 탐색하였는데 다시 원점으로 돌아오면서 하나의 loop처처럼 형성이되어 어느 출발점에서 출발해도 결국 답은 하나라는 것이다.

1-2-3-4-1

2-3-4-1-2

3-4-1-2-3

4-1-2-3-4

이런식으로 방문하는 순서만 달라지지 순서는 결국 동일하다.

따라서 출발점은 어디가 되었던지 모든 경로를 탐색하여 비용이 최소인 경로를 찾아 출력만 하면되는 문제이다.


답안 코드

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
#include <stdio.h>
int map[13][13], visit[11],min=2000000,N;
 
//탐색함수.
int search(int x,int total, int v)
{
    if (x == 1 && v == N + 1)
    {
        if (total < min) min = total;
        return 0;
    }
    if (visit[x]) return 0;
    visit[x] = 1;//방문한 곳은 1로
 
    for (int i = 1; i <= N; i++)
    {
        if (map[x][i])
        {
            total += map[x][i];//비용을 더해준다.
            search(i,total,v+1);//재귀
            total -= map[x][i];//다른 경로를 탐색을 위해 직전 비용을 -
        }
    }
    visit[x] = 0;//함수를 빠져나가면서 다시 0으로
    return min;
}
 
int main()
{
    scanf("%d",&N);
 
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= N; j++)
            scanf("%d",&map[i][j]);
 
    printf("%d",search(1,0,1));
    return 0;
}
cs