[백준/Python]10971_외판원 순회 2
2021. 6. 14. 00:49ㆍ백준 알고리즘
문제
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
풀이
각 도시에서 시작하여 모든 도시를 방문하고 다시 처음 도시로 돌아오는 한붓그리기 문제다.
간선의 비용이 다르고 경로의 정보를 저장해야하기 때문에 DFS를 사용한다.
외판원 최소 순회 비용인 min_value는 10억으로 초기화 한다.
start: 시작 노드, current: 현재 노드, value: 현재 노드까지 쓴 비용, visited: 경로
DFS 종료 조건
: matrix의 0은 연결이 안됨을 의미하기 대문에 len(visited) == n일 때, current에서 start로 가는 길인 matrix[current][start]가 0이 아니여야 한다.
코드
import sys
def dfs(start, current, value, visited):
global min_value
if len(visited) == n:
if matrix[current][start] != 0:
min_value = min(min_value, value + matrix[current][start])
return
for i in range(n):
if matrix[current][i] != 0 and i not in visited:
visited.append(i)
dfs(start, i, value + matrix[current][i], visited)
visited.pop()
n = int(sys.stdin.readline().rstrip())
matrix = []
min_value = int(1e9)
for _ in range(n):
matrix.append(list(map(int, sys.stdin.readline().rstrip().split())))
for i in range(n):
dfs(i, i, 0, [i])
print(min_value)
'백준 알고리즘' 카테고리의 다른 글
[백준/Python]9251_LCS (0) | 2021.06.16 |
---|---|
[백준/Python]10451_순열 사이클 (0) | 2021.06.15 |
[백준/Python]13305_주유소 (0) | 2021.06.14 |
[백준/Python]1120_문자열 (0) | 2021.06.14 |
[백준/Python]1057_토너먼트 (0) | 2021.06.13 |