Am Anfang: Es ist ein Programmierwettbewerbsproblem, aber kein laufendes. Leider kann ich keinen Link zu dieser Aufgabe bereitstellen, da sie nicht öffentlich verfügbar ist. Es war von einem der polnischen lokalen Programmierwettbewerbe im Jahr 2011, die von der Warschauer Schule für Informatik organisiert wurden.
Ich habe ein Diagramm mit Eckpunkten ohne Kanten und eine Liste von gerichteten Kanten. In der ten Sekunde wird die te Kante zu einem Diagramm hinzugefügt. Ich möchte wissen, nach welcher Sekunde ein Zyklus in einem Diagramm angezeigt wird.
Die naheliegendste Lösung wäre, nach dem Hinzufügen jeder Kante eine DFS durchzuführen, aber es würde Zeit dauern . Eine andere Lösung wäre, das Diagramm topologisch sortiert zu halten, und wenn ich eine Kante hinzufüge, könnte ich es so platzieren, dass es die topologische Reihenfolge nicht stört. Dies würde höchstens Zeit dauern . Ich habe bei Google recherchiert und es scheint, dass dies der schnellste Online-Algorithmus ist.
Da ich alle Kanten vorher kenne, kann ich den Offline-Algorithmus verwenden. Der schnellste Offline-Algorithmus, den ich mir vorstellen kann, ist die binäre Suche. Wenn der Graph nach der ten Sekunde einen Zyklus enthält, hat er offensichtlich einen Zyklus bei jeder anderen Sekunde . Ich kann also eine binäre Suche durchführen, um das kleinste zu finden, indem ich DFS -Zeiten durchführe, wobei jede von ihnen -Zeit benötigt, sodass die Gesamtkomplexität dieser Lösung .
Es ist ziemlich schnell, aber ich frage mich, ob es einen schnelleren Offline-Algorithmus gibt. Eine Sache, die ich mir vorstellen kann, ist, für jedes Kantengewicht den Zeitpunkt anzugeben, zu dem diese Kante einem Diagramm hinzugefügt wurde. Dann wäre die Aufgabe gleichbedeutend mit dem Finden eines Zyklus mit minimalem maximalem Kantengewicht. Ich weiß nicht, ob es irgendwohin führt.