查找交换序列后每个节点占据的唯一位置的数量

问题描述

一条线上有 N (N

例如,

在时间单位 1,位置 a1 和 b1 处的节点交换。

在时间单位 2,位置 a2 和 b2 处的节点交换。

在时间单位 M,位置 aM 和 bM 的节点交换。

在时间单位 M + 1,位置 a1 和 b1 处的节点交换。

在时间单位 M + 2,位置 a2 和 b2 处的节点交换。

等等……

对于每个节点,您需要确定它将占据的唯一位置的数量

示例:

6 个节点,M = 4(序列由 4 个交换组成),K = 7(总时间单位为 7)。

顺序:

(1,2) (2,3) (3,4) (4,5)

模拟:

时间 0:{1、2、3、4、5、6}

时间 1:{2,1,3,4,5,6}

时间 2:{2,6}

时间 3:{2,6}

时间 4:{2,6}

时间 5:{3,2,6}

时间 6:{3,6}

时间 7:{3,6}

答案:

节点 1 到达位置 {1,5},所以是 5 个位置。

节点 2 到达位置 {1,4},所以是 4 个位置。

节点 3 到达位置 {1,3},所以 3 个位置。

节点 4 到达位置 {2,4},所以 3 个位置。

节点 5 到达位置 {3,5},所以是 3 个位置。

节点 6 没有移动,所以它到达了位置 {6},所以是 1 个位置。

解决此问题的一种方法是将节点视为图形。然后,您可以将每个交换视为连接,然后使用图形算法来计算您如何在节点之间移动。

我怎样才能成功地将图算法结合到这个问题中?

编辑:我花了几个小时思考这个问题,并希望将 Ehsan 的想法融入解决方案中。要找到每个位置的可能节点,您可以使用递归函数,例如 Ehsan 提出的函数 (F(F(...(F(original_order)))。然后,您可以对中的每个步骤执行此操作K. 但是,这将是一个 NK 解决方案,我的速度太慢了,因为我可以执行的最大操作数是 10^9。我该如何优化我当前的想法?

解决方法

您不需要图表。 他们的关键是减少 k

引理:假设在一系列步骤 {n1,n2,n3,...,nN} 之后,从原始节点列表 {s1,s2,.....,st} 到达新的节点顺序,例如 {n_i1,n_iN},并且每个节点都有一个唯一的访问列表作为 { {1}}

然后如果您再次执行相同的一系列步骤,您可以在上一步的帮助下在 {n1_v1,n1_vn1},{nN_v1,nN_vnN} 中找到新的节点顺序列表和唯一访问列表。 所以这是一种动态规划。 通过这种方法,您的算法的复杂性可能为 O(n)