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

use*_*331 0 java algorithm dynamic-programming combinatorics

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

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

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

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

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

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

任何关于如何处理这个问题的建议都非常感谢.

Adr*_*hum 5

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

对于N> 2,您始终可以通过2次行程识别电线.


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

A  B  C  D  E
|  |  |  |  |

|  |  |  |  |
1  2  3  4  5
Run Code Online (Sandbox Code Playgroud)

(假设你现在在"数字"方面)

首先连接这样的电线:

A  B  C  D  E
|  |  |  |  |

|__|  |__|  |
1  2  3  4  5
Run Code Online (Sandbox Code Playgroud)

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

然后找到连接的对端.假设您找到BC,并且DE已连接.然后连接AB,CD.这将为您提供一条从5到E的长线.

A__B  C__D  E
|  |  |  |  |
\__________    
           \
|__|  |__|  |
1  2  3  4  5
Run Code Online (Sandbox Code Playgroud)

回到"数字"一边.断开所有这一面

A__B  C__D  E
|  |  |  |  |
\__________    
           \
|  |  |  |  |
1  2  3  4  5
Run Code Online (Sandbox Code Playgroud)

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

A__B  C__D  E
|  |  |  |  |
\___\__\___    
     \  \  \
|  |  |__|  |
1  2  3  4  5
Run Code Online (Sandbox Code Playgroud)

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

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


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

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

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

|__|  |__|  |  |
1  2  3  4  5  6
Run Code Online (Sandbox Code Playgroud)

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

回到数字方面.你会发现5或6中的一个没有任何其他导线(假设6),你知道它对应于F.

A__B  C__D  E  F
|  |  |  |  |  |
\__________    |
           \   |
|__|  |__|  |  |
1  2  3  4  5  6
Run Code Online (Sandbox Code Playgroud)

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


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