Розв’яжіть задачу на візок


14

Філософи давно обдумували проблему Тролейбуса . На жаль, ще ніхто не вирішив цю проблему. На щастя, як програмісти ми можемо використовувати комп’ютери для вирішення проблеми для нас!

Вхідні дані

Ваша програма прийме як вхід графік (кінцево), орієнтований (максимум на один край від xдо y, для будь-якого xі y), із визначеним вузлом та неотриманім цілим числом, приєднаним до кожного краю (що представляє кількість людей, прив’язаних до цієї доріжки) . Крім того, кожен вузол має щонайменше один край виходу.

Візок запускається у визначений вузол. Кожен поворот, якщо візка знаходиться у вузлі x, утилітарна обирає край (x,y). Люди на цьому краю вмирають, і візок зараз на краю y. Цей процес триває назавжди.

Зауважте, що люди можуть померти лише один раз, тому якщо на краю (x,y)є nлюди, прив'язані до нього, і візок перебігає їх, скажімо, 100 разів, це все одно призведе до nсмерті.

Вихідні дані

Утилітаризм робить свій вибір таким чином, щоб мінімізувати кількість людей, які помирають (що гарантовано буде кінцевим, оскільки є лише обмежені люди). Ваша програма виведе це число.

Формат введення

Ви можете взяти графік вводу будь-яким розумним способом. Наприклад, ви можете взяти його як матрицю і порахувати позначений вузол як той, що позначений 0. Якщо ви можете використовувати щось на зразок x1,y1,n1;x2,y2,n2;.... Наприклад, 0,a,0;a,b,5;a,c,1;b,b,0;c,c,0представити стандартну проблему з візками (з петлями в кінці).

Тестові шафи

  • 0,a,0;a,b,5;a,c,1;b,b,0;c,c,0 -> 1 (Перехід від 0 до a, a до c (вбивство однієї людини), а потім продовжуйте петлю візка від c до c).
  • 0,0,1;0,a,5;a,a,0 -> 1 (продовжуйте рухатись від 0 до 0, бігати над 1 людиною на всю вічність),
  • 0,a,5;0,b,1;a,a,1;b,b,6 -> 6 (0 -> a -> a -> a -> a -> ... (зауважте, що жадібне рішення переходу на b було б неправильним))
  • 0,a,1;0,b,5;a,b,1;b,a,1 -> 3 (0 -> a -> b -> a -> b -> ...)
  • 0,a,1;0,b,1;a,a,0;b,b,0 1

Це , тому найкоротша відповідь виграє! Удачі.

Примітки: Не буде жодних циклів хворої петлі, а переміщення багатодоріжок заборонено. Крім того, хоча я вважаю за краще вважати цю проблему з точки зору трьох законів Асимова Пітер Тейлор зазначив у пісочниці, що ця проблема є математично еквівалентною проблемі пошуку rho (шлях, коли петлі повертаються на себе) з найменшою вагою .



2
@BetaDecay так, але через оновлення до візки вони поводяться так само, як і звичайні люди, для цього питання.
PyRulez

Відповіді:


6

Желе , 27 23 байт

ṗL$µṭ0FIm2ASµÐḟµQ⁴ySµ€Ṃ

Спробуйте в Інтернеті! (останній тестовий випадок)

Жорстока версія (Зніміть більшість людей)

Приймає введення як цифри. Для останнього прикладу 1є aі 2є b. 0є вихідним вузлом. Перший аргумент - це список ребер (наприклад [0,1],[0,2],[1,1],[2,2]), а другий аргумент - це список ребер та кількість людей на них (наприклад [[0,1],[0,2],[1,1],[2,2]],[1,1,0,0]).

Як це працює

ṗL$µṭ0FIm2ASµÐḟµQ⁴ySµ€Ṃ
ṗL$                       - on the first argument, get the Cartesian power of it to its length.
                            this gives all paths of the length of the input. Cycles are implicit
   µ        µÐḟ           - get valid paths starting with 0 -- filter by:
    ṭ0                      - prepend 0
      F                     - flatten
       I                    - get the difference between elements
        m2                  - every second difference: 0 for each edge that starts at the node the previous edge ended at, nonzero otherwise.
          AS                - 0 iff all elements are 0
               µ    µ€    - on each path:
                Q           - remove repeat edges.
                 ⁴y         - translate according to the mapping in the second program argument
                   S        - Sum
                      Ṃ   - get the minimum of these.

@Shaggy Umm, не впевнений, що ти маєш на увазі? Чи болить вам желе чи щось?
Ерік Аутгольфер

1
@EriktheOutgolfer він посилається на версію програми, яка намагається поранити більшість людей.
fireflame241

@Shaggy Це було б цікавим завданням.
PyRulez

9

Python 3 , 80 байт

y=lambda d,s=0,p=[],f=0:f in p and s or min(y(d,s+d[f][t],p+[f],t)for t in d[f])

Спробуйте в Інтернеті!

Вводиться як словник, введений ідентифікатором вузла. Записи - це словник сусідів та кількість людей на колії між вузлом та сусідом. Наприклад, для першого тестового випадку:

{0: {1: 0}, 1: {2: 5, 3: 1}, 2: {2: 0}, 3: {3: 0}}

0 - початковий вузол, 1 - вузол 'a', 2 - вузол 'b' і т.д.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.