Encontre ciclo negativo com restrições de vértice

11

Dado um gráfico com arestas ponderadas, como podemos encontrar um ciclo negativo que contenha pelo menos um vértice em um determinado conjunto de vértices ? Obrigado.{V1,V2,,Vk}

Tianyi Cui
fonte
Esta questão não é clara. Pesos sobre o que, arestas ou vértices? O que é , é um vértice ou um conjunto de vértices? V 1{V1,V2,,Vk}V1
Yixin Cao
@YixinCao Obrigado por notar, editado: peso nas bordas, é um vértice. V1
Tianyi Cui

Respostas:

8

Se você não exige que o ciclo seja simples, divida o gráfico (direcionado) em seus componentes fortemente conectados e, para cada componente que contém um dos vértices , verifique se o componente contém um ciclo negativo. Se nenhum componente existir, não haverá um ciclo negativo contendo . Mas se algum componente o fizer, você poderá encontrar um ciclo negativo (não simples) contendo , fazendo muitas cópias do ciclo negativo e adicionando a esses caminhos os caminhos de e para algum vértice do ciclo para . (O tempo total para encontrar uma representação implícita do ciclo desejado será o mesmo que o tempo para encontrar um ciclo negativo em um gráfico direcionado, por exemplo, , se bem me lembro.)V i V i V i O ( n m )ViViViViO(nm)

Se você exige que o ciclo seja simples, o problema se torna NP completo, mesmo que apenas um único vértice seja fornecido. (Você pode reduzir o caminho hamiltoniano para o problema: para encontrar um caminho hamiltoniano de uma determinada fonte para um determinado coletor em um dado gráfico , forneça o peso das arestas existentes -1 e adicione um vértice artificial com duas arestas de custo cada, um de a e um de a .) S T G V 1 N / 2 - 0,01 V 1 S T V 1V1STGV1N/20.01V1STV1

Se você permitir que o ciclo repita vértices, mas não arestas, acredito que ele ainda esteja completo com NP (por uma redução semelhante, mas dividindo cada vértice em uma aresta direcionada maneira padrão).( v , v )v(v,v)

Neal Young
fonte
2
Eu gosto desta resposta muito melhor que a minha.
David Eppstein
6

Eu vou assumir que sua entrada é um gráfico direcionado; Não sei como fazer isso no caso não direcionado.

Faça cópias do conjunto de vértices do seu gráfico, onde é o número de vértices no gráfico. Substitua cada aresta de em no gráfico original por arestas que vão da cópia de para copiar de , para todas as opções de . Além disso, se pertence ao conjunto de vértices especificado, mas não o contrário, inclua também uma aresta que vai da cópia de para a cópia de .n u v i u i + 1 v i u i u u 0 vnnuviui+1viuiu0v

Todos os ciclos no gráfico expandido são projetados de volta para ciclos no gráfico original, mas todos os ciclos no gráfico expandido contêm um dos vértices especificados (caso contrário, você não pode retroceder nas camadas de expansão); portanto, o gráfico original contém um ciclo negativo contendo um vértice especificado se o gráfico expandido contiver qualquer ciclo negativo.

David Eppstein
fonte
Se o gráfico original tiver vértices e arestas, o gráfico recém-construído terá vértices e arestas . Encontrar ciclos negativos requer tempo , o que parece bastante grande. Ainda estou esperando por uma solução melhor e muito obrigado! m n 2 n m O ( n 3 m )nmn2nmO(n3m)
Tianyi Cui
2
Possivelmente mais problemático, os ciclos que encontrar não serão necessariamente simples. Você precisa de ciclos negativos simples?
David Eppstein