最短路徑——BFS算法


最短路徑——BFS算法

單源最短路徑問題

每對頂點間的最短路徑

BFS求無權圖的單源最短路徑

bool visited[MAX_VERTEX_NUM];	//訪問標記數組

//廣度優先遍歷
void BFS(Graph G,int v){		//從定點出發,廣度優先遍歷圖G
    visit(v);					//訪問初始頂點v
    visited[v]=TRUE;			//對v做已訪問標記
    Enqueue(Q,v);				//頂點v入隊列Q
    while(!isEmpty(Q)){
        DeQueue(Q,v);			//頂點v出隊列
        for(w=FirstNeighbor(G,v);
            w>=0;w=NextNeighbor(G,v,w))
            //檢測v所有鄰接點
            if(!visited[w]){	//w為v的尚未訪問的鄰接頂點
                visit(w);		//訪問頂點w
                visited[w]=TRUE;//對w做已訪問標記
                EnQueue(Q,w);	//頂點w入隊列
            }
    }
}
//求頂點 u 到其他頂點的最短路徑
void BFS_MIN_Distance(Graph G,int u){
    //d[i]表示從u到i結點的最短路徑
    for(i=0;i<G.vexnum;++i){
        d[i]=∞;		//初始化路徑長度
        path=[i]=-1;//最短路徑從哪個頂點過來
    }
    d[u]=0;
    visited[u]=TRUE;			//對v做已訪問標記
    Enqueue(Q,u);				//頂點v入隊列Q
    while(!isEmpty(Q)){
        DeQueue(Q,u);			//頂點v出隊列
        for(w=FirstNeighbor(G,u);
            w>=0;w=NextNeighbor(G,u,w))
            //檢測v所有鄰接點
            if(!visited[w]){	//w為v的尚未訪問的鄰接頂點
                d[w] = d[u]+1;	//路徑長度加1
                path[w]=u;		//最短路徑應從u到w
                visited[w]=TRUE;//設已訪問標記
                EnQueue(Q,w);	//頂點w入隊列
            }
    }
}

就是對BFS的小修改,在visit一個頂點時,修改最短路徑長度d[]並在path[]記錄前驅結點


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM