BFS实现单源最短路径

/*
广度优先搜索 实现单源最短路径
*/
#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;
}

 

posted @ 2025-04-30 16:00  磐正  阅读(12)  评论(0)    收藏  举报