Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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_Dynamic Programming_Graph Theory - Fatal编程技术网

Algorithm 在给定顶点和某些限制的情况下,查找图中的所有路径

Algorithm 在给定顶点和某些限制的情况下,查找图中的所有路径,algorithm,graph,dynamic-programming,graph-theory,Algorithm,Graph,Dynamic Programming,Graph Theory,我试图为下面的问题想出一个算法,但直到现在我还不能解决它。我想这个问题属于图论问题的范畴。也许有人能给我一个关于正确关键字/算法的提示: 所以我的问题是:我有一组顶点和一些限制。我试着找到顶点之间的所有边 我有一个顶点的nxn矩阵 我有一个开始S和结束E的声音,就像一个网络/流 可以忽略S和E的列和行中的顶点 S位于矩阵中的1,1处,E位于n,n处 图的方向是从S到E,也就是说,我必须找到一条从左上角到右下角的路。我不能回去了。 对于矩阵中的每一步,我都必须增加行和列 我必须在S和E之间至少穿过

我试图为下面的问题想出一个算法,但直到现在我还不能解决它。我想这个问题属于图论问题的范畴。也许有人能给我一个关于正确关键字/算法的提示:

所以我的问题是:我有一组顶点和一些限制。我试着找到顶点之间的所有边

我有一个顶点的nxn矩阵 我有一个开始S和结束E的声音,就像一个网络/流 可以忽略S和E的列和行中的顶点 S位于矩阵中的1,1处,E位于n,n处 图的方向是从S到E,也就是说,我必须找到一条从左上角到右下角的路。我不能回去了。 对于矩阵中的每一步,我都必须增加行和列 我必须在S和E之间至少穿过一个顶点 让我们看一看这个例子:

S - - -
- 1 2 -
- 3 4 -
- - - E
我可以识别路径

S>1>4>E S>3>E S>2>E S>4>E在我们的用例中与S14E相同,但这并不重要。如果我们能通过算法过滤掉它,那就好了,但不是必须的。 一个更复杂的例子

S - - - -
- 1 2 3 -
- 4 5 6 -
- - - - E
使用以下路径:

S>1>5>E S>1>6>E S>1>E S>2>6>E S>2>E,与S26E相同* S>3>E S>4>E S>5>E,与S15E相同* S>6>E *在我们的用例中


还可以考虑将高度为B、宽度为T的矩形划分为大小相等的矩形的问题。在我们的用例中,B和T的分隔数应该是可修改的。查看图片中的示例

我不确定这是否有用,但也许你可以看看Theta*只需谷歌“Theta star”。我不确定这是否符合您的需要,但我觉得您只需要一个非贪婪的实现。

看起来可以使用简单的最短路径算法来解决

图G=V,E。边集E={i,j,其中rowj>rowi和colj>coli}另外,确保Start,End不是E的一部分。那么,很容易看出这个图没有定向循环。从起点到终点的任何路径都是满足约束的路径。特别是,通过应用Dijkstra的最短路径算法,很容易获得的最短路径满足您的约束


要找到起点和终点之间的所有路径,需要某种枚举算法。一般来说,图中两个节点之间的路径数与图输入大小成指数关系。

在我对动态规划的评论中,动态规划是解决这个问题的一种方法,如果只需要几个解的话。我误读了这个问题

要打印所有解,必须计算所有解,这是通过递归完成的。递归的步骤具有属性gcdx,y=1,因为若不是这种情况,则步骤将“跳过”某些节点

下面是一个简单的python解决方案,它以您指定的格式打印结果

from fractions import gcd

def valid_steps(max_x, max_y):
    for x in xrange(1, max_x+1):
        for y in xrange(1, max_y+1):
            if gcd(x, y) == 1:
                yield x, y

def _solve(n, m, path, xy_2_name):
    x, y = path[-1]
    if x == n and y == m:
        print [xy_2_name[xy] for xy in path]
        return
    for sx, sy in valid_steps(n - x, m - y):
        _solve(n, m, path + [(x+sx, y+sy)], xy_2_name)

def solve(n, m):
    xy_2_name = dict()
    xy_2_name[(1, 1)] = 'S'
    xy_2_name[(n, m)] = 'E'
    c = 1
    for y in xrange(2, m):
        for x in xrange(2, n):
            xy_2_name[(x, y)] = c
            c += 1
    _solve(n, m, [(1, 1)], xy_2_name)

solve(5, 4)

提示:动态规划和步骤x,y必须满足gcdx,y=1。感谢您的提示和解决方案。在我发表文章几小时后,我自己也提出了一个递归解决方案,就我正确阅读python而言,它看起来与您的非常相似;-。