查找选定节点的有向未加权图中的所有路径
Find all paths in a directed, unweighted graph for a selected node
围绕这个主题有几个类似的问题,但我找不到符合我要求的问题。我正在研究一个食物网络程序(在 Javascript 中),并且有兴趣找到涉及选定物种(节点)的所有可能的食物链(路径)。换句话说,当有人在图中选择一个物种时,我想列出或突出显示涉及所选物种的每个单独的食物链。有关我正在处理的图表类型的示例,请参阅 EOL Food Web。
我希望这不会太复杂,因为边缘没有加权(没有价值)但确实有方向。我不需要最短或最长的路径 - 只需要涉及相关物种的所有可能变化。
我在想一个聪明的解决方案可能涉及首先从所选节点找到所有 "down"(朝向猎物)路径,然后对 "up"(朝向捕食者)路径执行相同的操作。然后将所有可能组合的起伏连接起来。但这可能不是很优雅。
非常感谢您的想法!
您的解决方案大致正确。
- 递归遍历图"downwards"记录所有路径
- 递归遍历图"upwards"记录所有路径
- 生成前两组的所有路径组合。
这假设该图没有循环(即没有生物以自身或任何捕食者或捕食者的捕食者等为食)
下面是一些遍历的伪代码。使用递归方法从感兴趣的节点开始:
paths := []
for all children
extendPath(paths, child)
function extendPath(NodeList[] paths, Node node)
for path in paths
path.add(node)
for child in node.children
extendPath(paths, child)
围绕这个主题有几个类似的问题,但我找不到符合我要求的问题。我正在研究一个食物网络程序(在 Javascript 中),并且有兴趣找到涉及选定物种(节点)的所有可能的食物链(路径)。换句话说,当有人在图中选择一个物种时,我想列出或突出显示涉及所选物种的每个单独的食物链。有关我正在处理的图表类型的示例,请参阅 EOL Food Web。
我希望这不会太复杂,因为边缘没有加权(没有价值)但确实有方向。我不需要最短或最长的路径 - 只需要涉及相关物种的所有可能变化。
我在想一个聪明的解决方案可能涉及首先从所选节点找到所有 "down"(朝向猎物)路径,然后对 "up"(朝向捕食者)路径执行相同的操作。然后将所有可能组合的起伏连接起来。但这可能不是很优雅。
非常感谢您的想法!
您的解决方案大致正确。
- 递归遍历图"downwards"记录所有路径
- 递归遍历图"upwards"记录所有路径
- 生成前两组的所有路径组合。
这假设该图没有循环(即没有生物以自身或任何捕食者或捕食者的捕食者等为食)
下面是一些遍历的伪代码。使用递归方法从感兴趣的节点开始:
paths := []
for all children
extendPath(paths, child)
function extendPath(NodeList[] paths, Node node)
for path in paths
path.add(node)
for child in node.children
extendPath(paths, child)