https://www.acmicpc.net/problem/10971
시간 2초, 메모리 256MB
input :
output :
조건 :
분명.. 알고리즘은 비슷한데 매번 뭐 하나가 빠져서 틀림...
그냥 시작 노드를 (0 ~ n - 1)
반복문을 돌면서 1개씩 골라서 전부 체크하자.
조건으로 설정할 것들.
data[now][next_node] 값이 0이 아니여야 하고, next_node가 visit에 들어있으면 안 된다.
자기자신을 가리키는 것은 0이여서 처리가 가능하니 생각 안해도 된다.
모든 경우를 다 보기 위해서 dfs를 수행 할 떄 처럼 dfs가 나오고 나서 visit에서 pop()을 해 주어야 한다.
그리고 마지막 노드에서 start노드로 올수 있는 길이 존재해야 한다..
import sys
n = int(sys.stdin.readline())
data = []
for i in range(n):
a = list(map(int, sys.stdin.readline().split()))
data.append(a)
def dfs(start, now, total, visit):
global ret
if len(visit) == n:
if data[now][start] != 0:
ret = min(ret, total + data[now][start])
return
for j in range(n):
if data[now][j] != 0 and j not in visit:
visit.append(j)
dfs(start, j, total + data[now][j], visit)
visit.pop()
ret = 9999999
for i in range(n):
dfs(i, i, 0, [i])
print(ret)
나는 각 노드에서 최소 거리를 구해가지고 가장 작은 노드를 찾아서 가려고 했는데 틀렸다.. 그냥 완전 탐색이면 다 돌려 버려야 겠다.