搜索->BFS小結

一、BFS的介紹

BFS(廣度優先搜索,也可稱寬度優先搜索)是連通圖的一種遍歷策略。因爲它的基本思想是從一個頂點V0開始,輻射狀地優先遍歷其周圍較廣的區域。
廣度優先搜索(BFS)類似於二叉樹的層序遍歷算法,它的基本思想是:首先訪問起始頂點v,然後由v出發,依次訪問v的各個未被訪問過的鄰接頂點w1,w2,w3….wn,然後再依次訪問w1,w2,…,wi的所有未被訪問過的鄰接頂點,再從這些訪問過的頂點出發,再訪問它們所有未被訪問過的鄰接頂點….以此類推,直到途中所有的頂點都被訪問過爲止。類似的想法還將應用與Dijkstra單源最短路徑算法和Prim最小生成樹算法。
廣度優先搜索是一種分層的查找過程,每向前走一步可能訪問一批頂點,不像深度優先搜索(DFS)那樣有回退的情況,因此它不是一個遞歸的算法,爲了實現逐層的訪問,算法必須藉助一個輔助隊列並且以非遞歸的形式來實現。

二、BFS搜索的步驟

    1、首先創建一個visit[ ]數組和一個隊列q,分別用來判斷該位置是否已經訪問過及讓未訪問過的點入隊;
    2、初始化visit[ ]數組,清空q隊列;
    3、讓起點start入隊,並使該點的visit置1;
    4、while(!q.empty()){......}執行搜索操作,
        a、取出隊頭元素後使隊頭元素出隊,判斷該元素是否爲目標到達點;
        b、如果是目標點,就返回結果(一般是最短時間、最短路徑);
        c、如果不是目標點,就繼續訪問與其相鄰的位置點,將可走的相鄰的位置點入隊,並更新visit[ ]數組;

三、BFS的應用

BFS算法一般應用於單源最短路徑的搜索。

1、尋找非加權圖(或者所有邊權重相同)中任兩點的最短路徑。

2、尋找其中一個連通分支中的所有節點。(擴散性)

3、bfs染色法判斷是否爲二分圖。

四、核心代碼

#include<iostream>
#include<queue>
#include<string.h>
#define maxn 105
using namespace std;

int n,m;    //矩陣的大小 
int sx,sy; 
int vis[maxn][maxn],s[maxn][maxn],t[maxn][maxn];
queue<struct node>Q; 
int px[]={1,-1,0,0};        //人可走的4個方向 
int py[]={0,0,1,-1};
struct node{
    int x,y,step;
}r,p,q;

int BFS()
{   
    //清空隊列及初始化vis數組 
    while(!Q.empty())
        Q.pop();
    memset(vis,0,sizeof(vis));
    p.x=sx;
    p.y=sy;
    p.step=0;
    vis[p.x][p.y]=1;
    Q.push(p);
    while(!Q.empty())
    {
        p=Q.front();
        Q.pop();
        if(s[p.x][p.y]=='t')
            return p.step;
        for(int i=0;i<4;i++)
        {
            q=p;
            q.x+=px[i];
            q.y+=py[i];
            q.step++;
            if(q.x<0||q.y<0||q.x>=n||q.y>=m)
                continue;
            //訪問未被訪問過的位置,且此時是在火勢蔓延到此前訪問的,再將該位置入隊
            if(vis[q.x][q.y]==0&&q.step<t[q.x][q.y])
            {
                vis[q.x][q.y]=1;
                Q.push(q);
            }
        }
    }
    return -1;
}

int main(){

    //功能需求代碼 
    //........

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章