Dies ist eine Herausforderung, die ursprünglich eine Aufgabe des Bundeswettbewerbs Informatik war , einem Wettbewerb für Schüler. Im Gegensatz zu der ursprünglichen Frage, bei der Sie eine gute Lösung finden und eine Dokumentation schreiben müssen, möchte ich, dass Sie dies Golf spielen. Ich versuche die Frage so gut wie möglich zu wiederholen:
Herausforderung
Viele Städte in Europa haben sogenannte Partnerstädte . In diesem Jahr gibt es ein besonderes Jubiläum, bei dem jedes Paar Partnerstädte in der EU ein Festival organisiert, um ihre Partnerschaft zu feiern. Um sicherzustellen, dass keine Stadt zu viele Festivals organisieren muss, gibt es in jeder Stadt eine Begrenzung der Festivals, die sie organisieren kann. Ist es möglich, die Feste so auf die Partnerstädte zu verteilen, dass jedes Paar Partnerstädte ein Festival in einer der beiden Städte organisiert und keine Stadt mehr Festivals organisiert, als es erlaubt ist? Wenn ja, erklären Sie wie.
Dies ist eine Karte einiger Städte, ihrer Partnerschaften und ihrer Grenzen für Festivals.
Partnerschaften http://dl.dropbox.com/u/1869832/partnerships.png
Bedarf
- Ihr Programm muss das Problem für beide Testfälle jeweils in einer Minute beenden. (Siehe unten)
- Informationen zum Eingabeformat finden Sie in den Testfällen.
Die Ausgabe sollte leer sein, wenn keine Lösung vorhanden ist, und sollte ansonsten das folgende Format haben: Eine Zeile für jedes Paar Partnerstädte,
a
fallscity1
das Festival organisiert wird,b
andernfalls.<city1>, <city2>, <a/b>
Die Lösung mit der geringsten Anzahl von Zeichen, die die Anforderungen erfüllt, gewinnt. Bei einem Unentschieden gewinnt das zuerst eingereichte Programm.
- Es gelten die üblichen Code-Golf-Regeln.
Testfälle
Die ursprüngliche Aufgabe hatte zwei Testfälle. Ich habe sie auf Github hochgeladen .
quelle
n
Knoten umgewandelt wird, won
die Budgetgrenze der Stadt liegt).Antworten:
Python, 380 Zeichen
Dieser Code verwendet einen Maximum-Flow-Algorithmus im Push-Relabel- Stil.
N[x]
ist die Anzahl der Parteien, bei denen erlaubt istx
,X[x]
ist die Liste der Partnerstädte, in denen derzeit gehostet werden sollx
(die länger sein können alsN[x]
während des Algorithmus), undH[x]
ist die beschriftete Höhe vonx
. Für jede überzeichnete Stadt schieben wir entweder eine ihrer geplanten Partys in eine niedrigere Partnerstadt oder erhöhen ihre Höhe.quelle
C #,
1016 992916 ZeichenDauert 4 Sekunden für mich auf dem großen Test-Set; Leistung kann leicht eine Menge , indem sie verbessert werden
X
eineHashSet<s>
eher als einList<s>
.Dies nutzt die Reduzierung auf maximalen Durchfluss, auf die ich zuvor in den Kommentaren hingewiesen habe. Die Eckpunkte sind
S
und SenkeT
.Die Kanten sind
Der Algorithmus ist Ford-Fulkerson mit DFS. Es ist a priori offensichtlich, dass jeder Erweiterungspfad den Fluss um 1 erhöht, so dass die Golfoptimierung zum Entfernen der Berechnung des Pfadflusses keinen negativen Einfluss auf die Leistung hat.
Es gibt andere mögliche Optimierungen, indem Annahmen wie "Die Namen der Eingabedateien werden niemals mit den Namen der Städte übereinstimmen" getroffen werden, aber das ist ein bisschen zweifelhaft, IMO.
quelle