算法系列—广度优先搜索(BFS)

来源:互联网 发布:冒险岛交易市场数据 编辑:程序博客网 时间:2024/05/20 08:27

单点最短路径:给定一幅图和一个顶点s,从s到给定的顶点v是否存在一条路径?如果有,找出其中最短的那一条。

解决这个问题的经典方法叫做广度优先搜索。


广度优先搜索思路:

要找到从s到v的最短路径,从s开始,在所有由一条边就可以到达的顶点中寻找v,如果找不到,就继续在距离两条边的顶点中查找v,如此一直执行。

C++实现代码如下:
//BFS.cpp//无向图#include <iostream>#include <list>#include <queue>using namespace std;class Graph{int count = 0;//顶点数list<int> *adj;//邻接表bool *visited;public:void addEdge(int v, int w);//向图中添加边void BFS(int v);//广度优先搜索接口Graph(int count);};Graph::Graph(int count){this->count = count;adj = new list<int>[count];visited = new bool[count];for (int i = 0; i < count; ++i)visited[i] = false;}void Graph::addEdge(int v, int w){adj[v].push_back(w);adj[w].push_back(v);}void Graph::BFS(int v){queue<int> queue_node;//用队列保存下一步要访问的元素visited[v] = true;queue_node.push(v);while(!queue_node.empty()){int s=queue_node.front();cout << s << " ";queue_node.pop();for (int w : adj[s]){if (!visited[w]) {visited[w] = true;queue_node.push(w);}}}}/* 测试 */int main(){Graph g(5);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(2, 3);g.addEdge(3, 3);g.addEdge(0, 4);cout << "从2开始深度搜索" << endl;g.BFS(2);cout << endl;return 0;}


0 0