Eu já fiz essa pergunta no stackoverflow , mas talvez seja mais adequado para este site.
O problema é:
Eu tenho N pares de números inteiros não assinados. Eu preciso classificá-los. O vetor final dos pares deve ser classificado de forma não decrescente pelo primeiro número em cada par e não cada vez mais pelo segundo em cada par. Cada par pode ter o primeiro e o segundo elementos trocados a qualquer momento. Às vezes não há solução, então preciso lançar uma exceção então.
Exemplo:
in pairs:
1 5
7 1
3 8
5 6
out pairs:
1 7 <-- swapped
1 5
6 5 <-- swapped
8 3 <-- swapped
^^ Sem a troca de pares, é impossível construir a solução. Então trocamos pares (7, 1), (3, 8) e (5, 6) e construímos o resultado. ou
in pairs:
1 5
6 9
out:
not possible
obrigado
editar:
Tom Sirgedas, da SO, propôs a melhor solução . É realmente fácil de implementar e funciona em O (log (n) * n). Obrigado a todos pelas respostas e interesse. Eu realmente gostei da análise mjqxxxx.
fonte
Respostas:
Digamos que dois pares e P 2 = ( uma 2 , b 2 ) são compatíveis não-permuta , se eles podem ser colocados em qualquer ordem na lista classificada, sem trocar qualquer um. Isso é verdade se ( a 1 ≤ a 2 ∧ b 1 ≥ b 2 ) ou ( a 2 ≤ a 1 ∧ b 2 ≥ bp1=(a1,b1) p2=(a2,b2) (a1≤a2∧b1≥b2) . Note-se que p 1 e p 2 sejam compatíveis se e não de troca somente se eles sãode dois permuta compatível(uma vez que a ordem parcial satisfaz definidos p 1 ⪯ p 2 ≡ p * 2 ⪯ p * 1 , em que * indica a operação de permuta de) . Finalmente, p 1 e p 2 sãocompatíveis com uma trocase puderem ser colocados em qualquer ordem na lista classificada com exatamente uma delas trocada. Isso é verdade se p ∗ 1 e(a2≤a1∧b2≥b1) p1 p2 p1⪯p2≡p∗2⪯p∗1 ∗ p1 p2 p∗1 são compatíveis sem troca. Nos demais casos, p 1 e p 2 são simplesmente incompatíveis: eles não podem satisfazer a condição do pedido, independentemente do seu estado de troca.p2 p1 p2
O problema agora pode ser resolvido da seguinte maneira. Teste todos os pares de pares. Se qualquer par é incompatível, não há solução e podemos lançar uma exceção. Caso contrário, considere o gráfico com nós correspondentes aos pares originais e arestas entre os pares de nós que não são compatíveis com troca única. Cada par de nós deve ter o mesmo estado de troca em qualquer lista classificada corretamente e, portanto, todos os nós em cada componente conectado do gráfico devem ter o mesmo estado de troca. Precisamos determinar se esses estados de troca em todo o componente podem ser atribuídos de forma consistente. Teste todos os pares de nós em cada componente conectado. Se algum par não é compatível com troca não, não há solução e podemos lançar uma exceção. Agora teste todos os pares de componentes conectados (ou seja, para os componentesC1 e , testar todos os pares de nós p 1 ∈ C 1 e p 2 ∈ C 2 ). Sabemos que cada par de componentes é compatível com pelo menos um swap, mas alguns pares também podem ser compatíveis sem troca (porque cada par de nós não conectados por uma borda é compatível com pelo menos uma troca e também pode ser sem troca). compatível com troca). Considere um gráfico reduzido com nós correspondentes aos componentes conectados e uma aresta entre dois nós se os componentes correspondentes não forem compatíveis com troca não. Existe uma solução para o problema original se, e somente se, este gráfico for de 2 cores. Se não houver 2C2 p1∈C1 p2∈C2 2 2 -coloring, não há solução, e podemos lançar uma exceção. Se houver um, troque todos os nós em todos os componentes de uma única cor. Agora temos a garantia de que quaisquer dois nós são compatíveis sem troca e, portanto, podemos classificar corretamente a lista de pares usando a ordem parcial definida.
Cada etapa do algoritmo e, portanto, todo o algoritmo, pode ser executada no tempo .O(N2)
ATUALIZAÇÃO: Uma construção muito mais elegante é a seguinte. Se um par de pares não for compatível sem troca, conecte os nós correspondentes com uma aresta (forçando-os a ter cores diferentes em qualquer cor 2). Se um par de pares não for compatível com troca única, conecte os nós correspondentes com uma cadeia de comprimento 2 (forçando-os a ter a mesma cor em qualquer cor 2). Existe uma solução se e somente se o gráfico resultante for de duas cores. Para construir uma solução a partir de uma coloração azul-vermelha do gráfico, troque apenas os pares cujos nós correspondentes são azuis e classifique a lista resultante.
fonte
Deixe X (a, b) denotar a variável binária indicando se o par (a, b) deve ser trocado. Considere qualquer par de pares distintos (a, b) e (c, d) e escreva uma restrição binária nas variáveis X (a, b) e X (c, d) que sejam satisfeitas se e somente se os dois pares estiverem em a ordem correta após a execução dos swaps indicados por X (a, b) e X (c, d), respectivamente. A conjunção de todas essas restrições binárias é uma fórmula 2-SAT em n variáveis e cláusulas O (n ^ 2) que é satisfatória se e somente se o problema original tiver uma solução. Isso pode ser verificado no tempo O (n ^ 2).
Quanto à solução original, observe que todas as restrições têm a forma X (a, b) = X (c, d) ou X (a, b)! = X (c, d) (ou então X (a, b) = constante), portanto, um simples algoritmo "mesclar e verificar a bipartidade" funciona:
Comece com cada X sendo o representante do conjunto que contém apenas ele próprio; então, para cada par (X, Y) tal que X = Y é uma restrição, mescle os componentes aos quais X e Y pertencem; e finalmente verifique se o gráfico contratado, em que cada componente é um vértice e alguma aresta une os componentes que contêm X e Y se o relacionamento X! = Y deve ser mantido, é bipartido.
fonte