無權最短路徑BFS(廣度優先搜尋)演算法(圖論)
阿新 • • 發佈:2019-02-01
廣度優先搜尋(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;
}