Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 找到确保猴子被击中的最小射击次数?_Algorithm_Graph - Fatal编程技术网

Algorithm 找到确保猴子被击中的最小射击次数?

Algorithm 找到确保猴子被击中的最小射击次数?,algorithm,graph,Algorithm,Graph,您是森林中的猎人,想要在一组相连的树上射杀一只猴子。我们可以一次打一枪。每次射击后,猴子都会跳到相邻的树上。每次拍摄时,它都需要改变位置。为了确保猴子被射杀,最少要拍多少张照片?作为输入,我们得到了一个相互相邻的树列表。例如:让我们考虑下面3个图表: 对于i图:我们可以按照节点的顺序进行拍摄:2。我们一定会按这个顺序射杀猴子 对于ii图:如果我们从图中删除节点10,顺序将是:2 3 4 5 6 7 6 5 4 3 2 对于iii图:解决方案是不可能的 以下是我为提出解决方案而实施的算法的简要概述

您是森林中的猎人,想要在一组相连的树上射杀一只猴子。我们可以一次打一枪。每次射击后,猴子都会跳到相邻的树上。每次拍摄时,它都需要改变位置。为了确保猴子被射杀,最少要拍多少张照片?作为输入,我们得到了一个相互相邻的树列表。例如:让我们考虑下面3个图表:

对于i图:我们可以按照节点的顺序进行拍摄:2。我们一定会按这个顺序射杀猴子

对于ii图:如果我们从图中删除节点10,顺序将是:2 3 4 5 6 7 6 5 4 3 2

对于iii图:解决方案是不可能的

以下是我为提出解决方案而实施的算法的简要概述:

检查循环是否出现在给定的无向图中。我们可以通过实现DFS并跟踪访问的节点和父节点来实现这一点。 如果存在循环,则不可能解决。 如果没有循环,请在此图中使用DFS查找最长路径的长度。设n为最长路径中存在的节点总数,并将其编号为1到n。 如果n为奇数,则必须按照以下顺序在这些节点上放炮: 2 n-1 n-2 n-3…2 n-1 n-2 n-3…2 如果n为偶数,则放炮顺序为: 2 3 4…..n-2 n-1 n-1 n-2…..4 3 2 例如,如果最长路径中的节点数为5,则放炮顺序将为

2 4 3 2 4 3 2

如果节点数为8,则顺序为

234567756432

还要查找图中是否存在距离为2或大于最长路径中最近节点距离的节点。如果存在这样的节点,那么解决方案就不可能存在。 使用上面的算法,我可以对大多数情况进行分类,但实际上第六步有一个问题。不管怎样,我关于第六点的结论是正确的,那么就没有任何解决办法了吗?那样的话,我怎么解决呢?我目前的算法有效地解决了这个问题,还是有更好的方法

那么,我关于第六点的结论是真的吗 没有解决办法吗?那样的话,我怎么解决呢

为你找到了一个反例,第6点

    z
    a
1-2-3-4-5
对于该示例,存在一个解决方案a 3 2 3 4 a 3 2 3 4

{12345Az}{12345Z}=>{12345A} {12345a}{12345a}=>{12345z} {1 2 3 4 5 z}{1 3 4 5 z}=>{2 3 4 5 a} {2 3 4 5 a}{2 4 5 a}=>{1 3 4 5 z} {1 3 4 5 z}{1 3 5 z}=>{2 4 a} {2 4 a}{2 4}=>{1 3 5} {1 3 5} {1 5} => {2 4} {2 4} {4} => {3 5} {3 5} {5} => {4} {4} {} {可能猴子位置}<射击位置>{射击后可能活猴子位置}=>{移动后可能猴子位置}

我目前的算法对这个问题有效还是有效 有没有更好的办法

对于i型图[最长路径的长度=n且无循环],返回

n、 当n2 对于n>2,你会发现解总是2 3 4。。。n-2N-1N-1N-2。。。4 3 2. 例如,长度为5的i型图

1-2-3-4-5
{1 2 3 4 5} {1 3 4 5} => {2 3 4 5} {2 3 4 5} {2 4 5} => {1 3 4 5} {1 3 4 5} {1 3 5} => {2 4} {2 4} {2} => {1 3} {1 3} {1} => {2} {2} {} 进一步考虑我的解决方案,将图分为两种类型的节点,其中所有相邻节点都是当前节点的相反节点类型

A-B-A-B-A

上述解决方案只是试图限制monkey在某一点仅停留在一种类型的节点上,例如节点类型A。之后,monkey只能停留在节点类型A或节点类型B中。剩下的过程是消除相同类型的剩余节点。

您的代码在哪里?@cᴏʟᴅsᴘᴇᴇᴅ: 我对这个问题的算法有疑问。如果我把整个代码都放在这里,它会很长。所以我把我提出的算法的具体步骤放在这里。我没有否决投票,但我怀疑你被否决的原因是因为这个。请看一下如何提供一个。好吧,这是最小的,完整的和可验证的算法,我在我的最后已经制定了,我可以验证这是可行的。不知道为什么人们仍然对它投反对票!:你对ii的解决方案是错误的:猴子可以一直在9和10之间切换。上面的结论似乎与我的研究结果相符。但我想你需要把最长路径中奇数和偶数节点的情况分开。无论如何,我想为类型3图提供一个解决方案,其中除了长度为n的最长路径外,还有单独的节点,这可能形成长度为n-1的第二条最长路径。@ashishkumar对于类型1图,节点的奇数或偶数没有区别。您始终可以使用n-2快照删除上一段中描述的1种类型的节点。然后用另一个n-2射击来消除剩余的可能性。是的,没错。但对于2型图,它仍然是
如果存在更长的此类路径,则很难找到解决方案。我只是想验证一下。@ashishkumar对于类型2图形,最好使用DP让程序检查是否有解决方案。很难找到2型图的通用解决方案。这将是一个非常有趣的方法。谢谢你指出这一点。让我试试这些句子,看看是否有意义。