b = [true];
x = [0];
y = [0];
z = [0];
# raw = [ [0,3,14,18,15],
# [3,0,4,22,20],
# [17,9,0,16,4],
# [9,20,7,0,18],
# [9,15,11,5,0] ]
# raw =[[0 , 6 , 6 , 4],
# [6, 0 , 4 , 6],
# [6, 4 , 0 , 7],
# [4 , 6 , 7 , 0]]
def printArray(a):
print("Solution{:3d}".format(num),end="")
print(":",end=" " )
for i in range(1, n + 1):
print("{:4d}".format(a[i]-1), end="")
print()
def count(k, buocdi, luotdi):
if (buocdi < x[0]):
for i in range(1, n + 1):
if (b[i] and buocdi < x[0]):
x[k] = i # raw[i-1][k-1]
z[k] = x[k - 1]
luotdi += 1
if (k != 1):
buocdi += raw[z[k] - 1][i - 1]
if (k == n):
buocdi += raw[x[k] - 1][x[1]-1]
if (buocdi < x[0]):
x[0] = buocdi
else:
b[i] = false
if (buocdi < x[0]):
count(k + 1, buocdi, luotdi)
if (k != 1):
buocdi -= raw[z[k] - 1][i - 1]
b[i] = true
def printRes(k, buocdi, luotdi):
try:
if (buocdi <= mindis):
# print("Bước đi hiện tại đang nhỏ hơn bước đi cơ sở",buocdi,x[0])
for i in range(1, n + 1):
if (b[i] and buocdi <= mindis):
x[k] = i # raw[i-1][k-1]
z[k] = x[k - 1]
luotdi += 1
if (k!=1):
buocdi += raw[z[k] - 1][i - 1]
if (k == n):
# print("Ô cuối cùng ở vị trí: ",x[k],x[1],end=" ")
# print("Giá trị",raw[x[k] - 1][x[1]-1])
buocdi += raw[x[k] - 1][x[1]-1]
# printArray(x)
# print("Fake",buocdi)
# print()
if (buocdi == mindis):
global num
num+=1
printArray(x)
# print("Real: ",buocdi)
else:
b[i] = false
if (buocdi <= mindis):
printRes(k + 1, buocdi, luotdi)
if (k != 1):
buocdi -= raw[z[k] - 1][i - 1]
b[i] = true
except:
print("Solution 1: 0")
n = int(input())
raw = []
for i in range(0, n):
raw.append([int(x) for x in input().split()])
for i in range(1, n + 1):
b.append(true)
x.append(1)
z.append(0)
global num
num=0
x[0] = 9999999999999999999999999999999999999999999999999999999999999999
count(1, 0, 0)
if n == 1:
x[0] = raw[0][0]
mindis = x[0]
# x[0]=1
print("Min total distance =",mindis)
printRes(1, 0, 0)