假设两对和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根本不兼容:无论交换状态如何,它们都不能满足订购条件。p2是无交换兼容的。在其余情况下,和p 2p1p2
现在可以如下解决该问题。测试每一对。如果任何一对都不兼容,则没有解决方案,我们可以抛出异常。否则,考虑与这些对那些节点之间对应于原始对节点和边的曲线不是一个交换兼容。在任何适当排序的列表中,每对这样的节点对必须具有相同的交换状态,因此,图的每个连接组件中的所有节点都必须具有相同的交换状态。我们需要确定是否可以一致地分配这些组件范围的交换状态。测试每个连接的组件内的所有节点对。如果任何一对都不兼容,则没有解决方案,我们可以抛出异常。现在测试所有成对的已连接组件(即,对于组件C1和,测试所有节点对p 1 ∈ Ç 1和p 2 ∈ Ç 2)。我们知道每对组件至少是一次交换兼容的,但是有些组件对也可能是非交换兼容的(因为未通过边缘连接的每对节点至少是一次交换兼容的,而且也可能是不交换的)交换兼容)。考虑具有对应于所连接组件的节点的简化图,如果对应组件不兼容,则考虑两个节点之间的边。当且仅当此图为2色时,才可以解决原始问题。如果没有2C2p1∈C1p2∈C222-着色,没有解决方案,我们可以抛出异常。如果有一个,则交换单一颜色所有组件中的所有节点。现在,我们保证了任何两个节点都是无交换兼容的,因此我们可以使用定义的部分顺序对对列表进行正确排序。
算法中的每个步骤以及整个算法都可以在时间内执行。O(N2)
更新:以下是一个更为优雅的构造。如果一对线对不兼容,则将相应的节点与边缘连接(在任何2色中强制它们为不同的颜色)。如果一对对不兼容,则用长度为2的链连接相应的节点(强制它们在任何2色中为相同颜色)。当且仅当结果图为2色时,才有解决方案。要从图的蓝红色构造一个解决方案,请仅交换其对应节点为蓝色的那些对,然后对结果列表进行排序。