广度优先搜索算法1-已知若干个城市的路线,求从一个城市到另外一个城市的路径,要求路径中经过的城市最少。
生活随笔
收集整理的這篇文章主要介紹了
广度优先搜索算法1-已知若干个城市的路线,求从一个城市到另外一个城市的路径,要求路径中经过的城市最少。
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
例8.1 城市A到城市B的交通圖:
A->:b,c,d,f;
B->:a,f;
C->a,d,e;
D->a,d,g;
E->c,g,h;
F->a,b,h;
G->d,e,h;
H->e,f,g
從路線中可以看出A到H要經(jīng)過(guò)若干個(gè)城市,現(xiàn)在要找出一條經(jīng)過(guò)城市最少的路線
分析:
1.很容易想到用鄰接矩陣來(lái)表示,0表示能走,1表示不能走
2.鄰接矩陣最短路徑想到用隊(duì)列來(lái)表示
3.a數(shù)組是存儲(chǔ)擴(kuò)展節(jié)點(diǎn)的隊(duì)列,a[i]記錄經(jīng)過(guò)的城市,b[i]記錄前趨城市
4.將城市A入隊(duì),隊(duì)首為0,隊(duì)尾為1
5.將隊(duì)首所指的城市所有可直通的城市入隊(duì)(若出現(xiàn)過(guò)就不入隊(duì)),將入地城市的前趨城市保存在b[i]中,
6.然后將隊(duì)首加1,得到新的隊(duì)首城市。重復(fù)以上步驟直到搜到H結(jié)束。
#include <iostream>
#include<bits/stdc++.h>
using namespace std;int ju[9][9]{{0,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,1,1},//a和a之間是1,是不能走的{0,0,1,1,1,1,0,1,1},{0,0,1,1,0,0,1,1,1},{0,0,1,0,1,1,1,0,1},{0,1,1,0,1,1,1,0,0},{0,0,0,1,1,1,1,1,0},{0,1,1,1,0,0,1,1,0},{0,1,1,1,1,0,0,0,1}
};
int a[101],b[101];
bool s[9];//輸出過(guò)程
void out(int d){cout<<char(a[d]+64);while(b[d]){d=b[d];cout<<"--"<<char(a[d]+64);}cout<<endl;
}//BFS算法實(shí)現(xiàn)
void doit(){//數(shù)據(jù)初始化int head,tail,i;head=0;//隊(duì)首為0tail=1;//隊(duì)尾為1,因?yàn)閍到a不能算a[1]=1;//記錄經(jīng)過(guò)的城市,現(xiàn)在第一個(gè)經(jīng)過(guò)的是a本身b[1]=0;//記錄前趨城市,a前面還沒(méi)有城市s[1]=1;//表示該城市已經(jīng)到過(guò),現(xiàn)在已經(jīng)到過(guò)a//循環(huán)判斷do{head++;//隊(duì)首加1,出隊(duì),從上一個(gè)城市往后走,第一次是從a開(kāi)始for(i=1;i<=8;i++){//搜索可直達(dá)的城市if((ju[a[head]][i]==0&&(s[i]==0))){//下個(gè)城市能直達(dá)并且沒(méi)被走過(guò),就是可走tail++;//隊(duì)尾加1a[tail]=i;//將i入隊(duì)b[tail]=head;//記錄tail的前趨城市s[i]=1;//記錄該城市已經(jīng)走過(guò)if(i==8){//第一次搜到的H城市最短out(tail);head=tail;break;}}}}while(head<tail);
}//主函數(shù)
int main(){memset(s, false, sizeof(s));doit();return 0;
}
運(yùn)行結(jié)果:
總結(jié):
廣度優(yōu)先搜索的核心思想 實(shí)際上是一個(gè)先進(jìn)先出的隊(duì)列(FIFO) 從初始節(jié)點(diǎn)開(kāi)始,應(yīng)用算符生成第一層節(jié)點(diǎn),檢查目標(biāo)節(jié)點(diǎn)是否在這些后繼節(jié)點(diǎn)中, 若沒(méi)有,再用產(chǎn)生式規(guī)則將第一層的節(jié)點(diǎn)逐一擴(kuò)展,得到第二層節(jié)點(diǎn),并逐一檢查第二層節(jié)點(diǎn)中是否包含目標(biāo)節(jié)點(diǎn), 若沒(méi)有,再用算符逐一擴(kuò)展到第二層的所有節(jié)點(diǎn)··· 如此依次擴(kuò)展,檢查下去,直到發(fā)現(xiàn)目標(biāo)節(jié)點(diǎn)為止補(bǔ)充:
剛開(kāi)始有點(diǎn)不太懂,即使懂了思想但是代碼也不太理解,
但是畫(huà)過(guò)圖之后就比較容易理解了,這里以鄰接鏈表為例
(參考青島大學(xué)王卓老師的視頻:https://www.bilibili.com/video/av36337654?from=search&seid=17495355141589125432)
初始時(shí):?
先訪問(wèn)v1,他有兩個(gè)子節(jié)點(diǎn),所以將v2,v3入隊(duì)
(類似于鄰接矩陣中的
if((ju[a[head]][i]==0&&(s[i]==0))){//下個(gè)城市能直達(dá)并且沒(méi)被走過(guò),就是可走tail++;//隊(duì)尾加1a[tail]=i;//將i入隊(duì)b[tail]=head;//記錄tail的前趨城市s[i]=1;//記錄該城市已經(jīng)走過(guò))然后從v2開(kāi)始訪問(wèn),它的三個(gè)子節(jié)點(diǎn)是v1,v4,v5(對(duì)應(yīng)序號(hào)是0,3,4)
v1訪問(wèn)過(guò)了,所以只用將v4,v5入對(duì)就可以了
以此類推,后面就是從v3開(kāi)始,再將v6,v7入隊(duì)
后面就是依次入隊(duì),出隊(duì)..................
總結(jié)
以上是生活随笔為你收集整理的广度优先搜索算法1-已知若干个城市的路线,求从一个城市到另外一个城市的路径,要求路径中经过的城市最少。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Hulu热招 | 用户身份认证团队
- 下一篇: 高考回忆录