单点最短路径:给定一幅图和一个顶点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;
}