您的位置:首页 > 其它

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

2016-11-03 16:07 120 查看
单点最短路径:给定一幅图和一个顶点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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: