두 쌍의 및 p 2 = ( a 2 , b 2 ) 는 정렬 된 목록에서 순서를 바꾸지 않고 순서대로 배치 할 수 있으면 스왑이 호환되지 않는다고 가정 하십시오. 이 사실 인 경우 중 어느 하나 ( 1 ≤ 2 ∧ B 1 ≥ B 2 ) 또는 ( 2 ≤ 1 ∧ B 2 ≥ Bp1=(a1,b1)p2=(a2,b2)(a1≤a2∧b1≥b2) . 참고로 , P 1 과 P 2는 노 바꾸면 호환없는 그들 만이 경우두 스왑 호환(보낸 부분 위해 정의를 만족 P 1 ⪯ P 2 ≡ P * 2 ⪯ P * 1 , * 스왑 동작을 나타낸다) . 마지막으로, p 1 과 p 2 는정확히 하나가 교체 된 정렬 된 목록에서 순서대로 배치 될 수있는 경우하나의 교체가 가능합니다. 이것이 사실이라면 P * (1) 및(a2≤a1∧b2≥b1)p1p2p1⪯p2≡p∗2⪯p∗1∗p1p2p∗1 는 스왑이 호환되지 않습니다. 나머지 경우 p 1 과 p 2 는 단순히 호환되지 않습니다. 스왑 상태에 관계없이 주문 조건을 충족시킬 수 없습니다.p2p1p2
이제 문제를 다음과 같이 해결할 수 있습니다. 모든 쌍을 테스트하십시오. 쌍이 호환되지 않으면 해결책이 없으므로 예외가 발생할 수 있습니다. 그렇지 않으면 원래 쌍에 해당하는 노드와 1 스왑 호환 되지 않는 노드 쌍 사이의 모서리가있는 그래프를 고려하십시오 . 이러한 각 노드 쌍은 올바르게 정렬 된 목록에서 동일한 스왑 상태를 가져야하므로 그래프의 연결된 각 구성 요소의 모든 노드는 동일한 스왑 상태를 가져야합니다. 이러한 구성 요소 전체 스왑 상태를 일관되게 할당 할 수 있는지 확인해야합니다. 연결된 각 구성 요소 내의 모든 노드 쌍을 테스트하십시오. 쌍이 호환되지 않는 쌍이면 해결책이 없으므로 예외가 발생할 수 있습니다. 이제 연결된 컴포넌트의 모든 쌍을 테스트합니다 (예 : 컴포넌트 C1그리고 , 모든 노드 쌍 p 1 ∈ C 1 및 p 2 ∈ C 2 )을 테스트합니다 . 우리는 각 구성 요소 쌍이 하나 이상의 스왑 호환 가능하다는 것을 알고 있지만 일부 쌍은 스왑 호환이 불가능할 수도 있습니다 (가장자리로 연결되지 않은 각 노드 쌍은 하나 이상의 스왑 호환 가능하기 때문에 스왑 호환 가능). 연결된 구성 요소에 해당하는 노드와 해당 구성 요소가 스왑이 호환 되지 않는 경우 두 노드 사이의 가장자리가있는 그래프를 줄 입니다. 이 그래프가 2 색인 경우에만 원래 문제에 대한 해결책이 있습니다. 2 가 없으면C2p1∈C1p2∈C222-색칠, 해결책이 없으며 예외를 던질 수 있습니다. 하나가 있으면 단일 색상의 모든 구성 요소에있는 모든 노드를 교체하십시오. 이제 두 노드 모두 스왑이 호환되지 않으므로 정의 된 부분 순서를 사용하여 쌍 목록을 올바르게 정렬 할 수 있습니다.
알고리즘의 각 단계, 따라서 전체 알고리즘은 시간에 수행 될 수 있습니다 .O(N2)
업데이트 : 훨씬 더 우아한 구성은 다음과 같습니다. 한 쌍의 쌍이 스왑이 호환되지 않는 경우 해당 노드를 가장자리로 연결합니다 (2 색에서 다른 색이되도록 함). 한 쌍의 쌍이 1 스왑 호환이 아닌 경우, 해당 노드를 길이가 2 인 체인으로 연결하십시오 (2 색에서 동일한 색이되도록 함). 결과 그래프가 2 색인 경우에만 해결책이 있습니다. 그래프의 파란색-빨간색으로 솔루션을 구성하려면 해당 노드가 파란색 인 쌍만 교체 한 다음 결과 목록을 정렬하십시오.