アルゴリズムノート-深さ/幅優先探索

アルゴリズムノート-深さ/幅優先探索

深さ優先探索と幅優先探索は、主にグラフ走査で使用されます。これらは高度にテンプレート化されています。個人的には、比較的単純なアルゴリズムだと思います。以下は、深さ優先探索と幅優先探索のテンプレートです。テンプレートに従って、さらに質問を行ってください。マスターできます

深さ優先探索

プロセス:

  1. 指定された開始頂点にアクセスします
  2. 現在アクセスしている頂点の未訪問の隣接する頂点がある場合は、訪問する頂点の1つを選択してから、最初のステップに戻ります。
  3. 現在の頂点の隣接するすべての頂点にアクセスした場合は、現在の頂点の前の頂点を返します

下の図に示すように、実際には、最初に一方の端に沿って端を訪問し、次にもう一方の端を訪問するために戻ります。

テンプレート

DFSは通常、再帰によって実装されます

 void dfs(int x){
    
    
    if (满足退出条件){
    
     
        退出处理
        return; 
    }
    for (;;){
    
    //枚举当前顶点的下一个邻接顶点
        if (顶点满足条件) {
    
    
            处理顶点
            dfs(顶点);//向下深入遍历
            }
    }
    return ;//退出 
}

ここで、次の隣接する頂点を列挙するとき、それがグラフにある場合は、最初に方向ベクトルを定義し、次にこれを使用して次の頂点を列挙しました
。例として、上、下、左、右の4つの方向を取り上げます。 :
最初に定義する:

 int fx[4][2] = {
    
    {
    
    -1, 0}, {
    
    0, 1}, {
    
    1, 0}, {
    
    0, -1}};

列挙する:

for (int i = 0; i < 4; i++)
{
    
    
   dfs(x + fx[i][0], y + fx[i][1], board);
}

幅優先探索

プロセス:

  1. 指定された開始頂点にアクセスします
  2. 頂点の隣接するすべての頂点をエンキューします
  3. 最初のアクセスキューの最初の要素に戻ると、キューの最初の要素がポップアップします

次の図に示すように、最初に現在の頂点の隣接する頂点をキューに追加してから、次のレイヤーの隣接する頂点にアクセスします
ここに画像の説明を挿入

テンプレート

BFSは通常、キューを介して実装されます

		queue<int> qu;//定义队列
        qu.push(起始顶点);
        while (!qu.empty())
        {
    
    
            auto front = qu.front();
            qu.pop();
            //获得首部顶点并将首部弹出

            for (;;)//遍历当前顶点的所有邻接顶点并加入队列
            {
    
    
                if (邻接顶点符合题目要求)
                {
    
    
                    qu.push(邻接顶点);
                }
            }
        }

上記のテンプレートは最も基本的な例にすぎません。トピックが異なれば間違いなく異なります。テンプレートと質問の意味に基づいて、さらに変更を加える必要があります。

1091.バイナリマトリックスの最短経路
130.周辺地域

おすすめ

転載: blog.csdn.net/shn111/article/details/123313243