Graph 图上的一般概念和示例

Graph 图上的一般概念和示例,graph,Graph,我正在寻找一个总体思路(可能是一些代码示例或至少是伪代码) 现在,这是有人给我的一个问题,或者更确切地说是给我看的,我不需要解决它,但我做了大部分问题,我遇到的问题是: 假设您有一个具有以下节点的有向加权图: AB5, BC4, CD8, DC8, DE6, AD5, CE2, EB3, AE7 问题是: 从C到C的距离小于x的不同路线有多少条。(比如,10、20、30、40) 不同旅行的答案是:CDC、CEBC、CEBCDC、CDCEBC、CDEBC、CEBCEBC、CEBCEBC 我遇到的

我正在寻找一个总体思路(可能是一些代码示例或至少是伪代码) 现在,这是有人给我的一个问题,或者更确切地说是给我看的,我不需要解决它,但我做了大部分问题,我遇到的问题是:

假设您有一个具有以下节点的有向加权图:

AB5, BC4, CD8, DC8, DE6, AD5, CE2, EB3, AE7
问题是: 从C到C的距离小于x的不同路线有多少条。(比如,10、20、30、40) 不同旅行的答案是:CDC、CEBC、CEBCDC、CDCEBC、CDEBC、CEBCEBC、CEBCEBC

我遇到的主要问题是,当我执行DFS或BFS时,我的实现首先选择节点并将其标记为已访问,因此我只能找到两条路径,即CDC和CEBC,然后我的算法退出。如果我没有将其标记为已访问,那么在下一次迭代(或递归调用)中,它将选择相同的节点,而不是下一个可用的路由,因此我必须始终将它们标记为已访问。但是,通过这样做,我如何获得例如CEBCEBCEBC,它在节点之间几乎是跳跃的


我看了我家里所有不同算法的书,每个算法都描述了如何进行DFS、BFS和寻找最短路径(所有的好东西),没有显示如何不确定地迭代,并且只有当一个人达到图的某个权重或达到某个顶点的次数时才停止。

那么为什么不保持分支和分支;在每个节点,您将评估两件事;此特定路径是否超过了权重限制(如果是,则终止分支),并且是我启动的节点(在这种情况下,将我的路径历史记录记录到“可接受的解决方案”列表);然后创建新的分支,每个分支在每个可能的方向上迈出一步。

那么为什么不保持分支和分支;在每个节点,您将评估两件事;此特定路径是否超过了权重限制(如果是,则终止分支),并且是我启动的节点(在这种情况下,将我的路径历史记录记录到“可接受的解决方案”列表);然后创建新的分支,每个分支朝着每个可能的方向迈出一步。

事实上,您有两个不同的问题:

  • 找到从C到C的所有不同循环,我们将它们称为
    C_1
    C_2
    ,…,
    C_n
    (使用DFS完成)
  • 每个
    C_i
    都有一个权重
    w_i
    ,那么您希望每个循环组合的总权重小于N。这是一个组合问题(似乎可以通过动态规划轻松解决)

事实上,您有两个不同的问题:

  • 找到从C到C的所有不同循环,我们将它们称为
    C_1
    C_2
    ,…,
    C_n
    (使用DFS完成)
  • 每个
    C_i
    都有一个权重
    w_i
    ,那么您希望每个循环组合的总权重小于N。这是一个组合问题(似乎可以通过动态规划轻松解决)

不应将节点标记为已访问;正如MikeB指出的,CDCDC是一个有效的解决方案,但它重新审视了D

我会这样做:

Start with two lists of paths: Solutions (empty) and ActivePaths (containing one path, "C"). While ActivePaths is not empty, Take a path out of ActivePaths (suppose it's "CD"[8]). If its distance is not over the limit, see where you are by looking at the last node in the path ("D"). If you're at "C", add a copy of this path to Solutions. Now for each possible next destination ("C", "E") make a copy of this path, ("CD"[8]) append the destination, ("CDC"[8]) add the weight, ("CDC"[16]) and put it in ActivePaths Discard the path. 从两个路径列表开始: 解决方案(空)和 活动路径(包含一个路径“C”)。 虽然ActivePath不是空的, 从ActivePath中取出一条路径(假设它是“CD”[8])。 如果距离不超过限制, 通过查看路径(“D”)中的最后一个节点,查看您的位置。 如果您位于“C”,请将此路径的副本添加到解决方案。 现在针对每个可能的下一个目的地(“C”、“E”) 复制此路径(“CD”[8]) 附加目标(“CDC”[8]) 加上重量(“CDC”[16]) 并将其放在ActivePath中 放弃路径。 这是DFS、BFS还是其他,取决于您在ActivePath中插入和删除路径的位置


无意冒犯,但这很简单,你说的是要查阅很多书来寻找答案。我建议在简单的例子变得更加明显之前,尽量多用它们。

您不应该将节点标记为已访问的节点;正如MikeB指出的,CDCDC是一个有效的解决方案,但它重新审视了D

我会这样做:

Start with two lists of paths: Solutions (empty) and ActivePaths (containing one path, "C"). While ActivePaths is not empty, Take a path out of ActivePaths (suppose it's "CD"[8]). If its distance is not over the limit, see where you are by looking at the last node in the path ("D"). If you're at "C", add a copy of this path to Solutions. Now for each possible next destination ("C", "E") make a copy of this path, ("CD"[8]) append the destination, ("CDC"[8]) add the weight, ("CDC"[16]) and put it in ActivePaths Discard the path. 从两个路径列表开始: 解决方案(空)和 活动路径(包含一个路径“C”)。 虽然ActivePath不是空的, 从ActivePath中取出一条路径(假设它是“CD”[8])。 如果距离不超过限制, 通过查看路径(“D”)中的最后一个节点,查看您的位置。 如果您位于“C”,请将此路径的副本添加到解决方案。 现在针对每个可能的下一个目的地(“C”、“E”) 复制此路径(“CD”[8]) 附加目标(“CDC”[8]) 加上重量(“CDC”[16]) 并将其放在ActivePath中 放弃路径。 这是DFS、BFS还是其他,取决于您在ActivePath中插入和删除路径的位置


无意冒犯,但这很简单,你说的是要查阅很多书来寻找答案。我建议大家继续玩简单的例子,直到它们变得更加明显。

CDCDCDC(或类似的)不是一个有效的解决方案吗?当然,如果它没有超过预定的权重限制,那么在您的例子中,限制必须是72,以澄清:这与表示节点的数据的易变性有关吗?您是否考虑过使用不可变表示法的递归算法(如函数式编程)?CDCDC(或类似)是否也是有效的解决方案?当然,如果它没有超过预定的权重限制,因此,在您的示例中,限制必须是72以澄清:这与表示节点的数据的可变性有关吗?你是否考虑过使用不可变表示法的递归算法(比如你在函数式编程中所做的);如果我们对权重求和,并且图中没有零权重循环。。。每个分支都会终止