日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

广度优先搜索算法1-已知若干个城市的路线,求从一个城市到另外一个城市的路径,要求路径中经过的城市最少。

發布時間:2023/12/16 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 广度优先搜索算法1-已知若干个城市的路线,求从一个城市到另外一个城市的路径,要求路径中经过的城市最少。 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
例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要經過若干個城市,現在要找出一條經過城市最少的路線

分析: 1.很容易想到用鄰接矩陣來表示,0表示能走,1表示不能走 2.鄰接矩陣最短路徑想到用隊列來表示 3.a數組是存儲擴展節點的隊列,a[i]記錄經過的城市,b[i]記錄前趨城市 4.將城市A入隊,隊首為0,隊尾為1 5.將隊首所指的城市所有可直通的城市入隊(若出現過就不入隊),將入地城市的前趨城市保存在b[i]中, 6.然后將隊首加1,得到新的隊首城市。重復以上步驟直到搜到H結束。 #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];//輸出過程 void out(int d){cout<<char(a[d]+64);while(b[d]){d=b[d];cout<<"--"<<char(a[d]+64);}cout<<endl; }//BFS算法實現 void doit(){//數據初始化int head,tail,i;head=0;//隊首為0tail=1;//隊尾為1,因為a到a不能算a[1]=1;//記錄經過的城市,現在第一個經過的是a本身b[1]=0;//記錄前趨城市,a前面還沒有城市s[1]=1;//表示該城市已經到過,現在已經到過a//循環判斷do{head++;//隊首加1,出隊,從上一個城市往后走,第一次是從a開始for(i=1;i<=8;i++){//搜索可直達的城市if((ju[a[head]][i]==0&&(s[i]==0))){//下個城市能直達并且沒被走過,就是可走tail++;//隊尾加1a[tail]=i;//將i入隊b[tail]=head;//記錄tail的前趨城市s[i]=1;//記錄該城市已經走過if(i==8){//第一次搜到的H城市最短out(tail);head=tail;break;}}}}while(head<tail); }//主函數 int main(){memset(s, false, sizeof(s));doit();return 0; }

運行結果:

總結:

廣度優先搜索的核心思想 實際上是一個先進先出的隊列(FIFO) 從初始節點開始,應用算符生成第一層節點,檢查目標節點是否在這些后繼節點中, 若沒有,再用產生式規則將第一層的節點逐一擴展,得到第二層節點,并逐一檢查第二層節點中是否包含目標節點, 若沒有,再用算符逐一擴展到第二層的所有節點··· 如此依次擴展,檢查下去,直到發現目標節點為止

補充:

剛開始有點不太懂,即使懂了思想但是代碼也不太理解,

但是畫過圖之后就比較容易理解了,這里以鄰接鏈表為例

(參考青島大學王卓老師的視頻:https://www.bilibili.com/video/av36337654?from=search&seid=17495355141589125432)

初始時:?

先訪問v1,他有兩個子節點,所以將v2,v3入隊

(類似于鄰接矩陣中的

if((ju[a[head]][i]==0&&(s[i]==0))){//下個城市能直達并且沒被走過,就是可走tail++;//隊尾加1a[tail]=i;//將i入隊b[tail]=head;//記錄tail的前趨城市s[i]=1;//記錄該城市已經走過)

然后從v2開始訪問,它的三個子節點是v1,v4,v5(對應序號是0,3,4)

v1訪問過了,所以只用將v4,v5入對就可以了

以此類推,后面就是從v3開始,再將v6,v7入隊

后面就是依次入隊,出隊..................

總結

以上是生活随笔為你收集整理的广度优先搜索算法1-已知若干个城市的路线,求从一个城市到另外一个城市的路径,要求路径中经过的城市最少。的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。