将一些操作交换到

时间:2018-03-16 13:16:45

标签: arrays algorithm

假设我们有一个包含所有初始值arr的数组0。现在我们获得n次操作 - 一个操作由两个数字a b组成。这意味着我们将+1添加到arr[a]的值,并将-1添加到arr[b]的值。

此外,我们可以在某些操作中交换数字,这意味着我们会将-1添加到arr[a]+1添加到arr[b]

我们希望实现一种情况,即使在所有这些操作之后,arr的所有值都等于0。我们想知道这是否可能,如果是的话,我们应该交换哪些操作来实现这一目标。

有什么想法吗? 一些示例输入:

3
1 2
3 2
3 1

应该导致 YES R N R 其中R表示撤消该操作,N不执行此操作。

输入:

3
1 2
2 3
3 2

得到答案NO

2 个答案:

答案 0 :(得分:1)

让每个数组元素成为图形中的顶点,操作(a,b)是从顶点ab的边(相同顶点之间可能有多条边)。现在从顶点a出发意味着减少数组元素a并前往顶点a意味着增加数组元素a。现在,如果每个顶点具有偶数个边,并且您找到一个循环路径,一旦您在数组中的总和为零,就会完全访问每个边。

这样的路径称为Eulerian cycle(维基百科)。来自维基百科:当且仅当每个顶点具有偶数度时,无向图具有欧拉循环,并且其具有非零度的所有顶点都属于单个连通分量。在您的情况下,只有所有断开连接的子图需要有一个欧拉循环,它足以计算每个数组索引出现的次数,如果每个数组的计数均匀,则始终有方法在数组中获得零总数

如果要查找要反转的操作,则需要找到其中一条路径,并检查边缘行进的方向。

答案 1 :(得分:0)

只计算指数出现的次数。如果所有索引都以偶数显示,则答案为是。

你可以通过施工证明。您需要从原始配对列表中构建配对列表。目标是构建列表,以便您可以匹配左侧显示的每个索引和右侧显示的索引。

从第一对到最后一对。对于每对,尝试匹配出现奇数次数的索引。

例如,在第一个示例中,每个索引都出现两次,因此答案为YES。要构建列表,请从(1,2)开始。然后你看一对(3,2)并且你知道右边出现一次,所以你把它换成左边的2 :( 2,3)。对于最后一对,你有(3,1)匹配1和3,目前只出现一次。

请注意,最后,您始终可以找到匹配的对,因为每个数字都以偶数显示。每个号码都应该匹配。

在第二个例子中,2出现了三次。所以答案是否定的。