Bei einem Kaktus wollen wir seine Kanten so gewichten, dass
- Für jeden Scheitelpunkt beträgt die Summe der Gewichte der auf den Scheitelpunkt einfallenden Kanten nicht mehr als 1.
- Die Summe aller Kantengewichte wird maximiert.
Die Antwort ist eindeutig nicht mehr als zum Eckpunkte ( wo ist die Summe für einen Scheitelpunkt und ist die Summe über jede Kante). Diese Grenze ist für Zyklusgraphen erreichbar, indem jede Kante 1/2 gewichtet wird.
Ich habe einen gierigen Algorithmus für Bäume gefunden. Weisen Sie den auf Blätter einfallenden Kanten einfach 1 zu und entfernen Sie sie und ihre Nachbarn in wiederholten Durchgängen aus dem Diagramm. Dadurch wird der Kaktus auf eine Reihe miteinander verbundener Zyklen reduziert. Zu diesem Zeitpunkt nahm ich an, dass die verbleibenden Zyklen nicht miteinander verbunden und jede Kante 1/2 gewichtet waren. Dies hat 9/10 Testfälle, ist aber natürlich unvollständig.
Wie können wir dieses Problem für Kakteen im Allgemeinen lösen? Ich würde Hinweise vollständigen Lösungen vorziehen, aber beides ist in Ordnung.
Diese Frage betrifft ein Problem aus einem InterviewStreet CompanySprint . Ich bin bereits angetreten, möchte aber einige Gedanken zu einem Problem haben (Lösungen werden nicht veröffentlicht, und ich habe meinen Kopf wegen dieses Problems gegen die Wand geschlagen).
quelle
Antworten:
Diese Frage hat mich also gestört: Warum ein Kaktus, wenn es bereits einen linearen Zeitalgorithmus für eine allgemeinere Klasse gibt?
Das ursprüngliche Problem ist als fraktionelles Matching-Problem bekannt und wurde, was nicht überraschend ist, ebenfalls untersucht. Balinski (dessen Ergebnis mir durch Schrijvers Buch Combinatorial Optimization bekannt gemacht wurde) charakterisierte die Extrempunkte des fraktionierten Matching-Polytops als bestehend aus einem Integer-Matching plus der Hälfte einer Sammlung ungerader Zyklen. Die relativ niedrigen Eingangsgrenzen gegeben, vermute ich , dass die beabsichtigte Lösung des Problems Poser Edmonds das zu ändern war Blüte Algorithmus in einer Weise , dass, denn jetzt werde ich gehen für Sie zu entdecken. Die Struktur der Zyklen in einem Kaktus macht diesen Algorithmus so einfach, dass er für einen Wettbewerb geeignet ist.
Wie sxu hervorhebt, ist dieses Problem für die lineare Programmierung zugänglich. Wenn Sie nur den Zielwert benötigen, hat die Dual-LP den gleichen Zielwert und ist das Problem der gebrochenen Scheitelpunktabdeckung. Das Schöne an der Scheitelpunktabdeckung ist, dass sie ein halbintegrales Optimum hat. In linearer Zeit können Sie die Tiefensuche verwenden, um eine Baumzerlegung des Kaktus der Breite O (1) zu berechnen und die duale LP mit einem dynamischen Programm zu lösen, das variable Werte in {0, 1/2, 1} versucht.
Wenn Sie tatsächlich eine Lösung für das Ursprüngliche benötigen, kann eine komplementäre Schlaffheit hilfreich sein, aber ich kann nicht anders, als zu vermuten, dass die Beschränkung auf Kakteen eine elementarere Lösung ermöglichen soll.
quelle
Sie können immer die lineare Programmierung verwenden : Erstellen Sie einfach eine Variable für jede Kante und eine Einschränkung für jeden Scheitelpunkt. Es muss jedoch eine bessere Lösung geben, da dies nicht die Tatsache nutzt, dass wir einen Kaktusgraphen haben. Ich schlage auch vor, LP-Algorithmen an einigen Beispielen auszuführen und zu versuchen, festzustellen, ob auf Kaktusgraphen etwas Interessantes passiert, aber nicht auf allgemeinen Graphen.
quelle