1. 程式人生 > >無權最短路徑BFS(廣度優先搜尋)演算法(圖論)

無權最短路徑BFS(廣度優先搜尋)演算法(圖論)

廣度優先搜尋(BFS)演算法類似於樹中的層次搜尋:

從任意點s出發,先遍歷與s相鄰的點,然後再遍歷於相鄰的點相鄰的點。注意有向圖必須是順方向的鄰接點。


為什麼說廣度優先搜尋可以用來求無權最短路徑呢?因為,廣度優先搜尋每次都會先發現距離s為k的所有頂點,然後才會 發現距離s為k+1的所有頂點。 s為起始點。

void BFS(Graph& g, Vertex& s)
 {
  queue<vertex> q;
  for each vertex v in g
  {
   v.distance = INFINITY;
  }
  s.distance = 0;
  
  q.enqueue(s);
  while (!q.Empty())
  {
   v = dequeue(q);
   for each w adjenct to v
   if (v.distance == INFINITY)
   {
    w.distance = v. distance + 1;       
    w.path = v;
    q.enqueue(w);
   }    
  }    
 }
 對於外面的while迴圈,會執行|V|次,因為每個頂點入隊出隊一次,而裡面的for迴圈會看到一共會執行|E|次,即變長, 所以該演算法時間複雜度為O(|V|+|E|)。
 列印最短路徑:
 void PrintPath(Graph& g, Vertex& target)
 {
  if (target.path is a vertex)
  {
   PrintPath(g, target.path);
  }
  cout << target;
 }