10971外販員巡回2
7499 ワード
質問する
海外販売員の巡回問題は英語で旅行Salesman問題(TSP)と呼ばれる問題であり、コンピュータ科学分野で最も重要な問題の一つである.様々な変種問題がありますが、最も一般的な形式の問題を見てみましょう.
1番からN番までの都市があり、都市の間に道があります.(道がないかもしれませんが)今あるセールスマンはある都市を出発して、N都市を通って、元の都市に戻るツアー旅行ルートを計画しています.でも、もう一回行った町には行けない.(最後に旅行を始めた都市に戻るのを除く)このような旅行ルートはいろいろあるかもしれませんが、最小限の旅行計画を立てたいと思っています.
行列W[i][j]の形で各パス時間の移動に要する費用が与えられる.W[i][j]は、都市iから都市jまでの料金を示す.費用は非対称です.すなわち、W[i][j]はW[j][i]とは異なる場合がある.すべての都市の費用は正の整数です.W[i][i]は常に0.場合によっては、都市iから都市jまでは不可能であり、この場合、W[i][j]=0となる.
Nと費用行列が与えられた場合、費用が最も低いセールスマンの巡回旅行経路を解くプログラムを作成します.
入力
1行目は都市の数Nを与える.(2≦N≦10)次のN行には費用行列がある.各行列の成分は1000000以下の正の整数であり、行けない場合は0を与える.W[i][j]は都市iからjまでの料金を表す.
常に巡ることができる場合のみ入力されます.
しゅつりょく
1行目は外販員のツアーに必要な最小費用を出力します.
に答える
外審員のすべての数字は巡回しなければならない.これは最小値を求める問題だ.permutation
を使用してすべてのシーケンスを取得した後
順番を確認し、最小長さを求める.import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
from itertools import permutations
N = int(input()) # 네명이면?
nums = list(range(N)) # 0,1,2,3 네명 만들어주기
graph =[]
for _ in range(N):
graph.append(list(map(int,input().split())))
every = list(permutations(nums,N)) # 0,1,2,3 으로 만들수 있는 모든 순열 만들기
result = int(1e9) # 큰값을 하나 만들어 놓는다
for cycle in every: # 아까만든 순열을 하나씩 돌면서
count =0 # 길의 합을 구해준다
for i in range(-1,N-1): # (0,1) (1,2) (2,3) (3,0) 을 계산하기 위한 (-1~3)
if graph[cycle[i]][cycle[i+1]]==0: # 만약 길이 막혀있다면
count = int(1e9) # count 초기화
else: # 길이 열려있다면
count += graph[cycle[i]][cycle[i+1]] # 합해준다
result = min(count,result) # 이전과 비교해 최소값을 구해준다
# 닫혀있다면 처음 값 그대로
if result == int(1e9): # 열린 길이 없다면
print(0) # 0 출력
else:
print(result) # 아니면 결과값 출력
Reference
この問題について(10971外販員巡回2), 我々は、より多くの情報をここで見つけました
https://velog.io/@bbnerino/10971-외판원-순회2
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
1行目は都市の数Nを与える.(2≦N≦10)次のN行には費用行列がある.各行列の成分は1000000以下の正の整数であり、行けない場合は0を与える.W[i][j]は都市iからjまでの料金を表す.
常に巡ることができる場合のみ入力されます.
しゅつりょく
1行目は外販員のツアーに必要な最小費用を出力します.
に答える
外審員のすべての数字は巡回しなければならない.これは最小値を求める問題だ.permutation
を使用してすべてのシーケンスを取得した後
順番を確認し、最小長さを求める.import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
from itertools import permutations
N = int(input()) # 네명이면?
nums = list(range(N)) # 0,1,2,3 네명 만들어주기
graph =[]
for _ in range(N):
graph.append(list(map(int,input().split())))
every = list(permutations(nums,N)) # 0,1,2,3 으로 만들수 있는 모든 순열 만들기
result = int(1e9) # 큰값을 하나 만들어 놓는다
for cycle in every: # 아까만든 순열을 하나씩 돌면서
count =0 # 길의 합을 구해준다
for i in range(-1,N-1): # (0,1) (1,2) (2,3) (3,0) 을 계산하기 위한 (-1~3)
if graph[cycle[i]][cycle[i+1]]==0: # 만약 길이 막혀있다면
count = int(1e9) # count 초기화
else: # 길이 열려있다면
count += graph[cycle[i]][cycle[i+1]] # 합해준다
result = min(count,result) # 이전과 비교해 최소값을 구해준다
# 닫혀있다면 처음 값 그대로
if result == int(1e9): # 열린 길이 없다면
print(0) # 0 출력
else:
print(result) # 아니면 결과값 출력
Reference
この問題について(10971外販員巡回2), 我々は、より多くの情報をここで見つけました
https://velog.io/@bbnerino/10971-외판원-순회2
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
外審員のすべての数字は巡回しなければならない.これは最小値を求める問題だ.
permutation
を使用してすべてのシーケンスを取得した後順番を確認し、最小長さを求める.
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
from itertools import permutations
N = int(input()) # 네명이면?
nums = list(range(N)) # 0,1,2,3 네명 만들어주기
graph =[]
for _ in range(N):
graph.append(list(map(int,input().split())))
every = list(permutations(nums,N)) # 0,1,2,3 으로 만들수 있는 모든 순열 만들기
result = int(1e9) # 큰값을 하나 만들어 놓는다
for cycle in every: # 아까만든 순열을 하나씩 돌면서
count =0 # 길의 합을 구해준다
for i in range(-1,N-1): # (0,1) (1,2) (2,3) (3,0) 을 계산하기 위한 (-1~3)
if graph[cycle[i]][cycle[i+1]]==0: # 만약 길이 막혀있다면
count = int(1e9) # count 초기화
else: # 길이 열려있다면
count += graph[cycle[i]][cycle[i+1]] # 합해준다
result = min(count,result) # 이전과 비교해 최소값을 구해준다
# 닫혀있다면 처음 값 그대로
if result == int(1e9): # 열린 길이 없다면
print(0) # 0 출력
else:
print(result) # 아니면 결과값 출력
Reference
この問題について(10971外販員巡回2), 我々は、より多くの情報をここで見つけました https://velog.io/@bbnerino/10971-외판원-순회2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol