使用某些动作找到相应的电线开始和结束所需的行程数

时间:2017-01-06 00:46:32

标签: java algorithm dynamic-programming combinatorics

如果我们愿意的话,我的一位教授给我们一个在假日期间考虑的问题,而且我不确定解决问题的正确方法。

问题如下: 我们有N条线(1≤N≤10^ 6)从A点到B点,但不知道哪条线末端对应于哪条线开始。有三种方法可以解决这个问题:

  • 在A点和B点之间旅行
  • 连接电线。 (这意味着你接受一部分电线并连接它们,这样你就可以将它们的结尾用作一个单一的结尾)
  • 测试是否连接了电线。 (您可以将其想象为电源线:例如,如果某些电线在A点连接,并且您在B点为这些连接电缆中的一根电缆供电,则可以看到哪些电缆已连接,因为它们也将通电)

目标是计算A和B之间所需的最小旅行次数。

E.g。对于3根电线,我们需要2次行程:我们连接两根电线并调用第三根电线A.然后我们前往另一点并测试哪根电线未连接到任何其他两根电线。这必须是电线A.然后我们将A与另一根电线连接,称之为B并返回。现在我们必须找到连接到A的电缆,它必须是B,第三个必须是C.

不幸的是,对于某些N来说,不可能弄清楚哪根线是哪根,例如对于N = 2.(我很确定N = 2是唯一的一个)。 N = 1表示零旅行。

非常感谢任何有关如何解决这个问题的建议。

1 个答案:

答案 0 :(得分:5)

所以我以前解决了类似的谜题。

对于N> 2,您可以随时通过2次旅行识别电线

对于奇数线(我用5作为例子)

A  B  C  D  E
|  |  |  |  |

|  |  |  |  |
1  2  3  4  5

(假设你现在在“数字”方面)

首先连接这样的电线:

A  B  C  D  E
|  |  |  |  |

|__|  |__|  |
1  2  3  4  5

然后前往“Alphabet”一侧。应该找到一条没有连接到任何其他端的电线(通过电导率测试其他端)。假设是A.然后你知道A对应于5

然后找到连接的对端。假设您发现B-C和D-E已连接。然后连接A-B,C-D。这将为您提供一条从5到E的长线。

A__B  C__D  E
|  |  |  |  |
\__________    
           \
|__|  |__|  |
1  2  3  4  5

返回“数字”一侧。断开所有这一面

A__B  C__D  E
|  |  |  |  |
\__________    
           \
|  |  |  |  |
1  2  3  4  5

然后测试哪根导线用5.假设它是3,那么你知道3对应于B.给定3-4最初连接而BC是一对,你知道4对应于C.再次连接3-4。

A__B  C__D  E
|  |  |  |  |
\___\__\___    
     \  \  \
|  |  |__|  |
1  2  3  4  5

查看1或2中的哪一个用5进行,然后你知道哪个对应于D,因此对应于E.

您可以使用此方法识别任意数量的奇数线。

对于偶数线,它类似于奇数:

步骤1,做同样的事情,但保持2线未连接

A  B  C  D  E  F
|  |  |  |  |  |

|__|  |__|  |  |
1  2  3  4  5  6

前往Alphabet侧,这次,您应该找到2根导线不导通任何其他导线(假设A和F)。让其中一个保持不变(假设为F)。如奇数方法所述,将A连接到E.

返回号码侧。您会发现5或6中的一个没有使用任何其他导线(假设6),您知道它对应于F.

A__B  C__D  E  F
|  |  |  |  |  |
\__________    |
           \   |
|__|  |__|  |  |
1  2  3  4  5  6

所以,你确定了6-F和5-A。其余的只是上面描述的奇数情况。

是的,对于N = 2,似乎没有办法识别它们,除非你被允许再带一根电线,或者至少带一个二极管:P