Dostajesz, jako listę, wektor lub cokolwiek, wiązkę 3-krotek lub cokolwiek, gdzie pierwsze dwie rzeczy są łańcuchami, a trzecia to liczba. Ciągi to miasta, a liczba to odległość między nimi. Kolejność miast w krotce jest dowolna (tzn. Nie ma znaczenia, który z nich będzie pierwszy, a który drugi), ponieważ w każdym kierunku jest taka sama odległość. Ponadto dla każdej pary połączonych cytatów jest dokładnie jedna krotka. Nie wszystkie miasta mogą być połączone. Ponadto odległość jest zawsze dodatnia (nie0
). Nie musisz sprawdzać tych warunków, możesz założyć, że dane wejściowe będą dobrze sformułowane. Twoim zadaniem jest zwracanie miast w cyklicznej sekwencji, tak że jeśli zaczniesz od jednego miasta i przejdziesz sekwencję z powrotem do tego samego miasta, całkowita odległość między miastami będzie minimalna (dokładnie i we wszystkich przypadki). Możesz założyć, że istnieje rozwiązanie. Powiedzmy na przykład, że otrzymałeś
[("New York", "Detroit", 2.2), ("New York", "Dillsburg", 3.7), ("Hong Kong", "Dillsburg", 4), ("Hong Kong", "Detroit", 4), ("Dillsburg", "Detroit", 9000.1), ("New York", "Hong Kong", 9000.01)]
Możesz wypisać dowolne z poniższych (ale musisz tylko wypisać jedno):
["Detroit","Hong Kong","Dillsburg","New York"]
["Hong Kong","Dillsburg","New York","Detroit"]
["Dillsburg","New York","Detroit","Hong Kong"]
["New York","Detroit","Hong Kong","Dillsburg"]
["Dillsburg","Hong Kong","Detroit","New York"]
["New York","Dillsburg","Hong Kong","Detroit"]
["Detroit","New York","Dillsburg","Hong Kong"]
["Hong Kong","Detroit","New York","Dillsburg"]
ponieważ jest to najkrótsza podróż: 13,9
ale nie
["Dillburg","Detroit","New York","Hong Kong"]
ponieważ nie jest najkrótszy.
Zobacz en.wikipedia.org/wiki/Travelling_salesman_problem
Punktacja
Tutaj zaczyna się robić ciekawie. Bierzesz liczbę posiadanych znaków, a następnie podłączasz je do najgorszego wzoru O-notacji. Powiedzmy na przykład, że piszesz program brutalnej siły, który ma 42 znaki. Jak wszyscy wiemy, najgorszy przypadek n!
, gdzie n
jest liczbą miast. 42! = 1405006117752879898543142606244511569936384000000000, więc taki jest twój wynik. Te najniższe wynikiem wygrywa .
Uwaga: później też mi to ulżyło, ale nie byłem pewien, jak to rozwiązać i miałem nadzieję, że nikt tego nie zauważy. Ludzie to zrobili, więc przejdę do sugestii Issacga:
jedynymi opcjami są O (n!) i O (b ^ n n ^ a ln (n) ^ k), a wszystkie granice muszą być jak najściślejsze, biorąc pod uwagę ten zapis
O(n!)
i O(b^n*n^a*ln(n)^k)
, a wszystkie granice muszą być jak najściślejsze, biorąc pod uwagę ten zapis. OP powinien jednak wyjaśnić.
O(n^2*2^n)
jest znacznie mniejsze niż w O(n!)
przypadku dużej liczby n.
O(n!)
ale nieO(sqrt(n)*n^n/e^n)
aniO(n!/100000000000000000000)
?