アルゴリズムノート-深さ/幅優先探索
深さ優先探索と幅優先探索は、主にグラフ走査で使用されます。これらは高度にテンプレート化されています。個人的には、比較的単純なアルゴリズムだと思います。以下は、深さ優先探索と幅優先探索のテンプレートです。テンプレートに従って、さらに質問を行ってください。マスターできます
深さ優先探索
プロセス:
- 指定された開始頂点にアクセスします
- 現在アクセスしている頂点の未訪問の隣接する頂点がある場合は、訪問する頂点の1つを選択してから、最初のステップに戻ります。
- 現在の頂点の隣接するすべての頂点にアクセスした場合は、現在の頂点の前の頂点を返します
下の図に示すように、実際には、最初に一方の端に沿って端を訪問し、次にもう一方の端を訪問するために戻ります。
テンプレート
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);
}
幅優先探索
プロセス:
- 指定された開始頂点にアクセスします
- 頂点の隣接するすべての頂点をエンキューします
- 最初のアクセスキューの最初の要素に戻ると、キューの最初の要素がポップアップします
次の図に示すように、最初に現在の頂点の隣接する頂点をキューに追加してから、次のレイヤーの隣接する頂点にアクセスします
テンプレート
BFSは通常、キューを介して実装されます
queue<int> qu;//定义队列
qu.push(起始顶点);
while (!qu.empty())
{
auto front = qu.front();
qu.pop();
//获得首部顶点并将首部弹出
for (;;)//遍历当前顶点的所有邻接顶点并加入队列
{
if (邻接顶点符合题目要求)
{
qu.push(邻接顶点);
}
}
}
上記のテンプレートは最も基本的な例にすぎません。トピックが異なれば間違いなく異なります。テンプレートと質問の意味に基づいて、さらに変更を加える必要があります。