一般検索のBFS
2782 ワード
前編ではDFSアルゴリズムについて述べたが,南の壁にぶつからず振り向かないのが特徴であり,これとは逆の広さ優先探索(BFS)について述べた.イメージ的に言えば、広捜はルートノードV 0から、その未アクセスのサブノードW 1,W 2を巡る…次に、そのサブノードからW 1未アクセスのサブノードを遍歴し、W 2未アクセスのサブノードを遍歴し、このようにして広検索遍歴を完了する.したがって,広探索アルゴリズムは深探索アルゴリズムに基づいて次のルートノードを記録するためのキューque[]を複数必要とし,アクセスされていないノードにアクセスするたびにノードをキューの末尾に加え,現在のノードのサブノード遍歴が終了した後にque[]キューヘッダが指すノードをルートノードとして遍歴し,上記の手順を繰り返す.コード実装:
操作から言えば,広捜比深捜は複雑であるが,最短経路を求める問題のあるBFSアルゴリズムがDFSアルゴリズムよりはるかに便利であることが利点である.この点は必ず覚えておいてください.例:http://poj.org/problem?id=3278題意:n,m,nからmまでの2つの数を入力し、今点Xにいる場合は、一歩歩いて3つの方法で:1.X+1まで歩いていきます.2.X-1まで歩いていきます.[原句]2*Xのところまでぴょんぴょん跳ねる.最低数ステップ到達m分析を求める:キューを確立し、キューの各量に対応する点の番号(num)とそれまで歩いたステップ数(sum)があり、またvis[]デジタル記録点がアクセスされたかどうかも必要である.(詳細はコードを参照)
BFSは最小ステップ数または最短距離を求めるのに適しており、古典的な例題は典例プレートを見る.
#include
#include
#include
#include
#include
using namespace std;
int que[105],a[105][105],vis[105];
int n,m,rear,head;//head ,rear
void BFS(int x)
{
cout<>n>>m;
//
for(int i=1;i<=n;i++)
{
vis[i]=0;
for(int j=1;j<=n;j++)
{
a[i][j]=0;
}
}
int u,v;
for(int i=1;i<=m;i++)
{
cin>>u>>v;
a[u][v]=1;a[v][u]=1;
}
head=0;rear=0;
BFSTravel();
cout<
操作から言えば,広捜比深捜は複雑であるが,最短経路を求める問題のあるBFSアルゴリズムがDFSアルゴリズムよりはるかに便利であることが利点である.この点は必ず覚えておいてください.例:http://poj.org/problem?id=3278題意:n,m,nからmまでの2つの数を入力し、今点Xにいる場合は、一歩歩いて3つの方法で:1.X+1まで歩いていきます.2.X-1まで歩いていきます.[原句]2*Xのところまでぴょんぴょん跳ねる.最低数ステップ到達m分析を求める:キューを確立し、キューの各量に対応する点の番号(num)とそれまで歩いたステップ数(sum)があり、またvis[]デジタル記録点がアクセスされたかどうかも必要である.(詳細はコードを参照)
#include
#include
#include
#include
#include
#include
using namespace std;
struct node
{
int num,sum; // h, num sum
}h;
int vis[100005];
queue que; // ,
int n,m,sum;
int BFS()
{
//
while(!que.empty())
que.pop();
// n h, 0,
h.num=n;h.sum=0;
que.push(h);
node cur,next; //
while(!que.empty())
{
cur=que.front();
que.pop();
//
if(cur.num==m) return cur.sum;
//
int dir[]={1,-1,cur.num,};
for(int i=0;i<3;i++)
{
next.num=cur.num+dir[i]; //
next.sum=cur.sum+1; // +1
//
if(next.num>=0&&next.num<100005&&!vis[next.num])
{
que.push(next);
vis[next.num]=1; //
}
}
}
return 0;
}
int main()
{
while(cin>>n>>m)
{
memset(vis,0,sizeof(vis));
sum=BFS();
cout<
BFSは最小ステップ数または最短距離を求めるのに適しており、古典的な例題は典例プレートを見る.