No começo: é um problema de concurso de programação, mas não de um problema em andamento. Infelizmente, não posso fornecer nenhum link para esta tarefa, porque ela não está disponível publicamente. Era de um concurso de programação local polonês em 2011, organizado pela Escola de Ciência da Computação de Varsóvia.
Eu tenho um gráfico com vértices sem arestas e uma lista de bordas direcionadas. Nosegundo -a aresta está sendo adicionada a um gráfico. Quero saber em que segundo haverá um ciclo em um gráfico.
A solução mais óbvia seria executar o DFS após adicionar cada borda, mas seria necessário Tempo. Outra solução seria manter o gráfico classificado topologicamente e, ao adicionar uma aresta, eu poderia colocá-lo de maneira a não perturbar a ordem topológica. Isso levaria no máximoTempo. Eu fiz algumas pesquisas no Google e parece que esse é o algoritmo online mais rápido.
Como conheço todas as bordas de antemão, posso usar o algoritmo offline. O algoritmo offline mais rápido que consigo pensar é na pesquisa binária. Se depois- o segundo segundo gráfico contém um ciclo; obviamente, ele terá um ciclo em qualquer outro segundo . Para que eu possa fazer pesquisa binária para encontrar as menores executando o DFS vezes, cada um deles tempo, então a complexidade total dessa solução seria .
É bastante rápido, mas gostaria de saber se existe algum algoritmo offline mais rápido. Uma coisa que consigo pensar é atribuir a cada peso de borda igual ao momento em que essa borda foi adicionada a um gráfico. Então a tarefa seria equivalente a encontrar um ciclo com o peso máximo mínimo da borda. Não sei se isso leva a algum lugar.