广度优先搜索算法1-已知若干个城市的路线,求从一个城市到另外一个城市的路径,要求路径中经过的城市最少。
生活随笔
收集整理的這篇文章主要介紹了
广度优先搜索算法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-已知若干个城市的路线,求从一个城市到另外一个城市的路径,要求路径中经过的城市最少。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hulu热招 | 用户身份认证团队
- 下一篇: 高考回忆录