我正在寻找一个大概(也许是一些代码示例或至少是伪代码) 现在,这是来自某人给我的问题,或者更确切地说给我看,我没有必要解决它,但无论如何我做了大部分问题,我遇到的问题是:
假设您有一个带有以下节点的有向加权图:
AB5, BC4, CD8, DC8, DE6, AD5, CE2, EB3, AE7
问题是: 从C到C有多少不同的路线,距离小于x。 (比方说,10,20,30,40) 不同旅行的答案是:CDC,CEBC,CEBCDC,CDCEBC,CDEBC,CEBCEBC,CEBCEBCEBC。
我遇到的主要问题是,当我执行DFS或BFS时,我的实现首先选择节点并将其标记为已访问,因此我只能找到2条路径,即CDC和CEBC,然后我的算法退出。如果我没有将其标记为已访问,那么在下一次迭代(或递归调用)时,它将选择相同的节点而不是下一个可用的路由,因此我必须始终将它们标记为已访问但是通过这样做我该如何获得例如CEBCEBCEBC,它几乎在节点之间反弹。
我查看了我在家里所有不同的算法书籍,而每个算法都描述了如何进行DFS,BFS和查找最短路径(所有好的stufF),没有显示如何不确定地迭代并且仅在何时停止一个达到一定的图形权重或达到某个顶点次数。
答案 0 :(得分:2)
那么为什么不保持分支和分支;在每个节点,你将评估两件事;这个特定的路径是否超过了权重限制(如果是这样,终止分支)并且是我开始的这个节点(在这种情况下,将我的路径历史记录到'可接受的解决方案'列表);然后建立新的分支,每个分支在每个可能的方向上迈出一步。
答案 1 :(得分:1)
您不应将节点标记为已访问;正如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.
这是否是DFS,BFS或其他东西取决于您插入和删除路径的ActivePath中的位置。
没有冒犯,但这很简单,你正在谈论为答案咨询很多书。我建议玩这些简单的例子,直到它们变得更加明显。
答案 2 :(得分:0)
事实上,你有两个不同的问题:
C_1
,C_2
,...,C_n
(使用DFS完成)C_i
都有一个权重w_i
,那么你希望每个周期组合的总权重小于N.这是一个组合问题(似乎很容易用动态编程解决)。