Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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 包含n个节点的最优图路径_Algorithm_Graph_Path - Fatal编程技术网

Algorithm 包含n个节点的最优图路径

Algorithm 包含n个节点的最优图路径,algorithm,graph,path,Algorithm,Graph,Path,在有向加权图中,是否有一个确定的算法来查找从点a到点B的路径,该图恰好访问N个节点,但不一定访问任何特定节点?我假设您正在尝试查找具有N个节点的最短/最长权重。这可能不是最优的,但从原始图中,您可以生成一个状态图,其中“N*(#Nodes)”节点表示由原始节点和所采取的步骤数组成,并通过一些最短路径算法(如“s#u算法”)来运行它 i、 e 变成 (A,0)->(B,1)->(C,2) \>(C,1) 然后,目标节点将是具有N个步骤的节点(B,N)-B。如果原始图不是DA

在有向加权图中,是否有一个确定的算法来查找从点a到点B的路径,该图恰好访问N个节点,但不一定访问任何特定节点?

我假设您正在尝试查找具有N个节点的最短/最长权重。这可能不是最优的,但从原始图中,您可以生成一个状态图,其中“N*(#Nodes)”节点表示由原始节点和所采取的步骤数组成,并通过一些最短路径算法(如“s#u算法”)来运行它

i、 e

变成

(A,0)->(B,1)->(C,2)
  \>(C,1)

然后,目标节点将是具有N个步骤的节点(B,N)-B。如果原始图不是DAG((X,0)->(Y,1)->(X,2))

我将假设您试图找到具有N个节点的最短/最长权重,那么这种方法将允许在原始图中循环。这可能不是最优的,但从原始图中,您可以生成一个状态图,其中“N*(#Nodes)”节点表示由原始节点和所采取的步骤数组成,并通过一些最短路径算法(如“s#u算法”)来运行它

i、 e

变成

(A,0)->(B,1)->(C,2)
  \>(C,1)

然后,目标节点将是具有N个步骤的节点(B,N)-B。如果原始图形不是DAG((X,0)->(Y,1)->(X,2)),这种方法将允许在原始图形中出现循环。

这个问题是已知的NP难问题,通过从。特别是,您可以通过多项式时间简化来求解哈密顿路径,如下所示:对于具有n个节点的图中的每一对可能的节点(s,t),询问是否有从s到t的路径正好通过n个节点。这只对您的解算器进行多项式调用,因此您的问题的任何多项式时间解决方案都将导致哈密顿路径问题的多项式时间解决方案


所以简而言之,除非p=NP,否则这个问题不应该使用多项式时间算法。

这个问题通过从。特别是,您可以通过多项式时间简化来求解哈密顿路径,如下所示:对于具有n个节点的图中的每一对可能的节点(s,t),询问是否有从s到t的路径正好通过n个节点。这只对您的解算器进行多项式调用,因此您的问题的任何多项式时间解决方案都将导致哈密顿路径问题的多项式时间解决方案


因此,简而言之,除非p=NP,否则你不应该期望这个问题有多项式时间算法。

我不确定我是否正确理解了它,你能做深度优先搜索吗(离源最多N-1层)


如果您可以访问该层中的目的地。你可以在那里找到一条路径。

我不确定我是否正确地理解了它,你能做一个深度优先搜索(离震源最多N-1层)吗


如果您可以访问该层中的目的地。你可以在下面找到一条路径。

我遇到的问题是,有多条路径连接特定的节点,所以它不仅仅是a->B->C vs.a->D->C,更像是a-1->B-3->C vs a-2->B-1->CI。我不太确定我是否理解你的意思,但让我澄清一下——对于原始图表中的每个节点T,我们生成N个节点
(T,0)、(T,1)、(T,2)…(T,N)
。对于原始图形中的每条边T->Y,我们在
(T,k)
(Y,k+1)
之间创建一条边。对于所有的K。因此,通过图形的路径应该总是以一个“(A,0)->(B,1)->(D,2)”等升序。我遇到的问题是,有多条路径连接特定的节点,所以它不仅仅是A->B->C vs.A->D->C,更多的是沿着A-1->B-3->C vs A-2->B-1->CI的路线,我不太确定我是否理解你的意思,但让我澄清一下——对于原始图中的每个节点T,我们生成N个节点
(T,0),(T,1),(T,2)…(T,N)
。对于原始图形中的每条边T->Y,我们在
(T,k)
(Y,k+1)
之间创建一条边。对于所有的K。因此,通过图的路径应该总是上升一个“(A,0)->(B,1)->(D,2)”等等。我喜欢你的方法,但实际的减少似乎并不完全正确。当图包含一条边(u,v)时,存在一条哈密顿路径,使得存在一条从v到u的路径,该路径访问n个节点。(因此,对图中的每条边调用一次解算器,以确定是否存在哈密顿路径)。@Tom Sirgedas我认为这将描述一个具有哈密顿循环的图,而不是路径。我喜欢你的方法,但实际的归约似乎并不完全正确。当图包含一条边(u,v)时,存在一条哈密顿路径,使得存在一条从v到u的路径,该路径访问n个节点。(因此,对图中的每一条边调用一次解算器,以确定是否存在哈密顿路径)。@Tom Sirgedas我认为这将描述具有哈密顿循环的图,而不是路径。