簡體   English   中英

如何使用廣度優先搜索確定是否可以在有向圖中到達頂點

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

當試圖確定有向圖中的頂點是否可達時,我使用廣度優先搜索來從我的源頂點到目標頂點遍歷圖形。 然而,當我比較我在bfs期間從隊列中彈出的內容(應該是我訪問過的每個頂點)時,它只返回false並且從不在任何實例中為真,盡管我知道圖形在某些情況下可以返回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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM