如何在Gremlin中仅返回终点未被其他路径使用过的路径?
从起点出发的单终点唯一路径高效生成方案
给定有向图结构如下:
A->B, B->D A->C, C->D A->E需要生成从A出发的所有路径,但每个终点仅保留一条路径(例如终点D只需保留A->B->D或A->C->D其中一条),同时要求在大图场景下无需先收集所有路径,直接高效剪枝。
核心逻辑:边遍历边标记,实时剪枝重复终点路径
不用先把所有路径都找出来再去重,而是在遍历过程中就掐掉那些会指向已找到过终点的分支。具体操作步骤(以深度优先搜索为例)
- 搞个集合存已经找到过路径的终点,比如叫
已覆盖终点,一开始是空的; - 从A开始走DFS,每走一步就记下来当前的路径;
- 走到某个节点时:
- 如果这个节点没后续节点(比如E、D),就看看它在不在
已覆盖终点里:- 不在的话,就把当前路径存下来,再把这个节点加到集合里;
- 已经在里面的话,直接往回走,这条分支不用再探了;
- 如果这个节点还有下一个节点,就挨个走邻接节点,但只要后续走到终点发现已经被覆盖,就立刻终止这条分支。
- 如果这个节点没后续节点(比如E、D),就看看它在不在
- 搞个集合存已经找到过路径的终点,比如叫
进阶优化:提前掐掉无效分支
比如当D已经被标记为已覆盖后,再走到B或者C的时候,直接跳过它们的后续路径——反正最终都是到D,已经有一条路径了,没必要再走一遍。实际走一遍的例子
- 从A出发走A->B->D:到D了,D不在集合里,存下这条路径,把D加进集合;
- 回到A,再走A->C:C的下一个是D,D已经在集合里了,直接跳过这个分支;
- 接着走A->E:E不在集合里,存下这条路径,把E加进集合;
- 所有分支都走完,得到两条符合要求的路径。
内容的提问来源于stack exchange,提问作者Avner Levy
相关产品推荐
相关产品推荐

