/*
广度优先搜索 实现单源最短路径
*/
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
class Graph{
private:
int V; //顶点数量
vector<vector<int>> adj;// 邻接表
public:
Graph(int vertices):V(vertices),adj(vertices){}
void addEdge(int u, int v){
adj[u].push_back(v);
adj[v].push_back(u);
}
void BFS(int start){
queue<int> q;
vector<bool> visited(V);
q.push(start);
visited[start]=true;
while(!q.empty()){
int current=q.front();
q.pop();
cout<<current<<" ";
for(auto neighbor:adj[current]){
if(!visited[neighbor]){
q.push(neighbor);
visited[neighbor]=true;
}
}
}
}
//1. 定义层 利用for循环队列的大小
//2. 定义数组,保存点到点的距离
int shortestPath(int start, int end){
//从0开始实现吧
vector<bool> visited(V);
vector<int> distance(V,0);
int path=0;
queue<int> q;
q.push(start);
visited[start]=true;
while(!q.empty()){
int current=q.front();
if(current==end)
return distance[current];
q.pop();
for(auto neighbor:adj[current]){
if(!visited[neighbor])
q.push(neighbor);
distance[neighbor]=distance[current]+1; //更新最短路径
visited[neighbor]=true;
}
}
return -1;
}
};
int main(){
Graph g(5);
g.addEdge(0,2);
g.addEdge(0,3);
g.addEdge(1,3);
g.addEdge(1,4);
g.addEdge(2,4);
g.BFS(0);
cout<<endl;
cout<<g.shortestPath(0,4)<<endl;
return 0;
}