如何使用广度优先搜索确定是否可以在有向图中到达顶点

How to determine if a vertex can be reached in a directed graph using breadth first search

本文关键字:有向图 顶点 广度优先搜索 何使用 是否      更新时间:2023-10-16

当尝试确定有向图中的顶点是否可访问时,我使用广度优先搜索将图从源顶点遍历到目标顶点。但是,当我比较我在 bfs 期间从队列中弹出的内容(应该是我访问过的每个顶点(时,它只返回 false,在任何情况下都永远不会返回 true,尽管我知道图形在某些情况下可以返回 true,有些人可以帮助我吗?

这是我的代码

    template <typename E> 
bool Graph<E>::isReachable(E fromKey, E toKey) const
{
   Edge* tmpEdge;
   Edge* pred;
   Edge* edgeWalk; 
   Vertex* walkPtr;
   Vertex* toPtr; 
   Vertex* tmp;
   Vertex* tmpFrom;
   Vertex* tmpTo;
   queue<Vertex*> q;
   /* find source vertex */
   tmpFrom = first;
   while (tmpFrom != NULL && fromKey > tmpFrom->data)
      tmpFrom = tmpFrom->pNextVertex;
   if (tmpFrom == NULL || fromKey != tmpFrom->data)
      return false;
   /* locate destination vertex */
   tmpTo = first; 
   while (tmpTo != NULL && toKey > tmpTo->data)
      tmpTo = tmpTo->pNextVertex;
   if (tmpTo == NULL || toKey != tmpTo->data)
      return false;
  walkPtr = first;
   while (walkPtr != NULL)
   {
      walkPtr->processed = 0;
      walkPtr = walkPtr->pNextVertex;
   }
   walkPtr = first;
   while (walkPtr != NULL)
   {
      if (walkPtr->processed < 2)
      {
         if (walkPtr->processed < 1)
         {
            q.push(walkPtr); 
            walkPtr->processed = 1;
         }
      }
      while (!q.empty())
      {
          tmp = q.front();
          q.pop();
          tmp->processed = 2;
          edgeWalk = tmp->pEdge; 
          while (edgeWalk != NULL)           
          {
              toPtr = edgeWalk->destination;
              if (toPtr->processed == 0)
              {
                  toPtr->processed = 1;
                  q.push(toPtr);
              }
              edgeWalk = edgeWalk->pNextEdge;
          }
          if (tmpTo->processed = 2)
              return true;
      }
      return false;
   }
}

您的顶点列表是否正确排序? 如果不是(看起来很可能(,您将无法找到 from 或 to 键并返回 false。 我说"可能",是因为底部的循环有几个问题,其中一个(tmpTo->processed = 2;你应该使用==(将导致函数一直返回true。