在找到两个节点之间的最短路径时避免循环

Avoiding cycles when finding shortest path between two nodes

我编写了一种方法来查找加权图中两个节点之间的所有可能路径。边可以是有向的或无向的。在大多数情况下,下面的算法正在运行并检索路径,就像我期望的那样。

但是,当节点 A 和 B 之间存在无向边时,它会从 B 循环回到 A 并将其包含在路径列表中。我将其输入为伪代码,因为这是一项作业,我不想让我的代码出现在互联网上:

Function(findPaths)
{
    currPaths -> LinkedList
    currPath -> add(StartingNode) 
    findPathsRecurs(StartNode, FinishNode, currPaths)
}

Function(findPathsRecurse)
{
    storePaths -> LinkedList
    for(All adjacent nodes V to StartNode)
    {
        if(V->visited)
        {
             if(V = FinishNode)
             {
                  currPath -> add(V)
                  storePaths -> add(currPath)
                  currPath -> remove(V)
             }
        }
    }
    for(All adjacent nodes V2 to StartNode)
    {
         if(V2->not visited OR V2->not = FinishNode)
         {
              currPaths->add(V2)
              v2->visit

              findAllPathsRecurs(v2, FinishNode, currPaths)
              currPaths->removeFromBack
              v2->unvisit
         }
    }
}

从某个节点 A 到节点 D 的预期输出:

Path 1: A->B->C->D
Path 2: A->B->D

某些节点 A 到节点 D 的实际输出:

Path 1: A->B->C->D
Path 2: A->B->D
Path 3: A->B->A->C->D

如果我在第一个 for 循环中将节点标记为已访问,然后在该循​​环结束之前未访问,则不会发生任何变化,这是可以预期的。如果我只是将它标记为已访问而不取消访问(在第一个 for 循环中),那么代码只存储一个路径,这也是有道理的。

我在解决这个问题时遇到了问题,如有任何帮助,我们将不胜感激!

过滤掉任何两次访问同一节点的路径。