Einführung
Du bist alleine auf einer Insel. Der Rest der Menschheit ist tot ( wahrscheinlich aufgrund des Fehlers im Code von user12345 ). Die Zombie-Piraten-Horde hat Ihre Insel erreicht und sie ist endlos. Es ist Zeit, Arsch zu treten oder Kaugummi zu kauen, und Sie sind alle aus Kaugummi.
Problem
Unser Schreckensszenario wird durch zwei ganze Zahlen in einer Zeile beschrieben, m
und n
. Auf Ihrer Insel befinden sich Außenposten mit einer eindeutigen Nummer von 1 bis m
. Die folgenden n
Zeilen enthalten jeweils drei ganze Zahlen, x
, y
und z
, durch einen Raum getrennt. x
und y
sind die eindeutigen IDs von zwei Außenposten undz
die Anzahl der Zombies, die auf dem Pfad zwischen ihnen angetroffen werden.
Wenn du einen Weg zurücklegst, verlierst du z
Munition und tötestz
Zombies. Wenn Sie den gleichen Weg wieder zurücklegen, werden Sie leider auf die gleiche Anzahl von Zombies stoßen. Alle Außenposten generieren bei jedem Befahren eines Pfades +1 Munition. Sie beginnen mit 100 Munition bei Außenposten 1. Alle Außenposten beginnen mit 0 Munition. Sie sterben sofort, wenn es keinen Weg gibt, für den Ihre Munition größer ist als die Anzahl der Zombies auf diesem Weg, und der Rest Ihrer Munition wird in Kills umgewandelt. So ist dein letzter Standpunkt.
Schreiben Sie ein Programm, das die maximale Anzahl von Zombies ausgibt, die Sie für ein bestimmtes Szenario töten können. Wenn Sie eine unendliche Anzahl von Zombies töten können, geben Sie einfach aus x
.
Beispiel Eingabe
5 6
1 2 4
2 3 4
3 1 4
2 4 10
2 5 10
1 1 50
Beispielausgabe
x
Annahmen
- Ein Pfad wird zwischen zwei gültigen Außenposten liegen. Das heißt 1 <=
x
/y
<=m
- Wenn ein Pfad zwischen
x
undy
nicht aufgeführt ist, kann er nicht befahren werden - Ein Pfad ist bidirektional
- 1
m
<<= 100 - 1
n
<<= 500 - Die Eingabe muss über stdin erfolgen, aus einer Datei gelesen oder als einziges Argument für das Programm akzeptiert werden und genau dem Format des Beispiels entsprechen
- Die Laufzeit Ihres Programms kann beliebig groß sein, muss aber bestimmbar begrenzt sein
Der Code mit den wenigsten Zeichen gewinnt!
1
mit 0 Munition? Ist das Diagramm undirektional?1->1
49 Munition kostet und der Zyklus1->2->3->1
auf lange Sicht 3 Munition.Antworten:
Java ( weniger grotesk:
841552913301)Okay. Im Grunde ist es mir peinlich, dass niemand eine Lösung vorgelegt hat.Also habe ich vor ein paar Tagen angefangen, dieses Problem zu lösen, b / c, es ist großartig. . Folgen Sie diesem Link, um meinen Fortschritt über GitHub zu verfolgen.
Bearbeiten
Neue Solver-Version, viel mehr "Golf", mit korrigiertem Zyklus-Checker, wie von MT0 identifiziert. Es werden auch Weiterleitungsrouten unterstützt, die durch Ändern der verfügbaren Speicherkapazität für die VM angepasst werden können. Neueste BIG Bearbeitung: Ich habe festgestellt, dass ich noch ein paar kleine Indexfehler und vorzeitige Optimierungen hatte, die dazu führten, dass eine große Anzahl von Gewinnarten nicht berücksichtigt wurde. Also das ist behoben, sorgfältig. Die neue Version ist kleiner und niedriger. Für unsere Referenzroute
java -Xmx2GB ZombieHordeMin
ist der Trick ganz gut (seien Sie gewarnt, es wird eine Weile dauern).Cooles Faktoid
In einer faszinierenden Twist gibt es viele Lösungen endlich 24 und mein Löser findet man sich von MT0 wird , aber im Prinzip identisch, mit der Ausnahme , dass es beginnt , durch die die anderen Vorposten verbunden zu besuchen
1
. Faszinierend! Völlig gegen die menschliche Intuition, aber vollkommen gültig.Lösungs-Highlights
Also hier ist meins. Es ist (teilweise) Golf, b / c es ist ein exponentieller, fast Brute-Force-Solver. Ich verwende einen IDDFS-Algorithmus (iterative Deepening Depth First Search), daher ist er ein großartiger allgemeiner Löser, der nicht überspringt und daher beide Teile der OP-Frage löst , nämlich:
Gib ihm genug Kraft, Gedächtnis und Zeit, und es wird genau das tun, sogar Slow-Death-Maps. Ich habe mehr Zeit damit verbracht, diesen Solver zu verbessern, und obwohl mehr getan werden kann, ist es jetzt ein bisschen besser. Ich habe auch den Ratschlag von MT0 zur besten Lösung für unendliche Zombies integriert und mehrere vorzeitige Optimierungen aus meinem Win-Checker entfernt, die verhindert haben, dass die vorherige Version ihn findet, und jetzt finde ich tatsächlich eine sehr ähnliche Lösung wie die beschriebene MT0.
Ein paar weitere Highlights:
Ich habe den Algorithmus instrumentiert, um es interessanter zu machen,Removed für Golfzweckeanzusehen. Folgen Sie einem der Links zu Github, um die ungolfed version zu sehen.Es gibt auch eine Reihe von Kommentaren, zögern Sie also nicht, Ihre eigene Lösung neu zu implementieren, indem Sie auf meinem Ansatz aufbauen, oder zeigen Sie mir, wie es gemacht werden sollte!Geschichte des Lösers
Der (Golf-) Code
Weiter zum Code ( hier oder hier die ungolfed version holen ):
Holen Sie sich den Code von Github hier, um alle Änderungen zu verfolgen, die ich vornehme. Hier sind einige andere Karten, die ich verwendet habe.
Ausgabebeispiel
Beispielausgabe für Referenzlösung:
Lesen Sie die Route Ausgabe wie folgt:
step
:source
,route-to-get-here
-ammo
. In der obigen Lösung würden Sie es folgendermaßen lesen:0
, am Außenposten1
mit Munition100
.1
Verwenden Sie bei Schritt die Route1
, um zum Außenposten3
mit Endmunition zu gelangen97
2
Verwenden Sie bei Schritt die Route1
, um zum Außenposten1
mit Endmunition zu gelangen95
Notizen schließen
Ich hoffe, ich habe meine Lösung schwerer zu schlagen gemacht, aber BITTE VERSUCHEN! Verwenden Sie es gegen mich, fügen Sie Parallelverarbeitung, bessere Graphentheorie usw. hinzu. Ein paar Dinge, die ich herausgefunden habe, könnten diesen Ansatz verbessern :
tote Strecken aussortieren. Meine derzeitige Lösung "erinnert" sich nicht daran, dass eine bestimmte Route in einer Sackgasse liegt, und muss sie jedes Mal neu entdecken. Es wäre besser, den frühesten Moment auf einem Weg zu verfolgen, bei dem der Tod sicher ist, und niemals darüber hinauszugehen.machte dies...Jede andere Lösung, bei der Speicher gegen Zeit eingetauscht wird oder die aggressive Vermeidung von Sackgassen.tat dies auch!quelle
Einige abstrakte Hinweise zu einer Lösung
Wenn ich Zeit habe, werde ich das in einen Algorithmus umwandeln ...
Für einen gegebenen Graphen
G
existiert dann ein verbundener Subgraphen,G'
der die Stadt enthält1
. Wenn es eine unendliche Lösung gibt, gibt es einen zusammenhängenden Untergraphen,G''
der Städte undG'
enthältV
P
Pfade .Die Pfade
P
vonG''
können so unterteilt werden, dass sie{p}
einen Pfad enthalten, der nur minimale Kosten für alle Pfade in sich hatP
undP/{p}
alle anderen Pfade (die einen Spanning Tree oder möglicherweise einen Zyklus bilden) sind. Wenn wir davon ausgehen , dassp
kein Schleifenkante (beide Enden an der gleichen Stadt verbindet) , dann wird es zwei Städte verbinden (v1
undv2
) und Kosten hatc
Munition dann Sie (der Überlebende) kann dann Verfahrweg vonv1
bisv2
und zurück zu einem Gesamtpreis von2c
Munition und dies wird die Munition in allen Städten von 2 (für eine Steigerung von insgesamt erhöhen2|V|
innerhalbG''
- von denen einige gesammelt wurde , wird vonv1
undv2
).Wenn Sie reisen von
v1
bisv2
zu und wiederv1
mehr (m
) und dann mal einen Ausflug ausv1
entlang der KantenP/{p}
alle Städte außer zu besuchenv1
undv2
vor der Rückkehr inv1
und dies dauertn
Pfade zu erreichen (wo|P/{p}| ≤ n ≤ 2|P/{p}|
da sollte man sich nie einen Weg mehr zu durchqueren muß als zweimal) mit einem Preis vonk
und erhalten die Städte2m|V|
Munition (von denen wiederum einige während der Durchquerung gesammelt wurden).Anhand all dessen können Sie erkennen, ob möglicherweise eine unendliche Lösung möglich ist, wenn die Kosten
k + 2mc
gleich oder niedriger als die Gesamtbelohnung sind2(m+n)|V|
.Das Problem hat eine zusätzliche Komplexität:
1
nach{p}
zur ersten Iteration und diese Kosten berücksichtigen. undm
undn
niedrig genug sind, damit Ihnen nicht die Munition ausgeht, bevor Sie die erste Iteration durchlaufen können, da die erste Iteration höhere Kosten verursacht als die nachfolgenden Iterationen.Dies führt zu einer kostenneutralen Lösung mit 24 Pfaden für das Beispiel in der Frage (die Zahlen sind die besuchten Städte):
quelle