基本内容:
广度优先遍历,是以广度为第一关键词,当碰到分岔路口的时候总是先依次访问从该岔路道口能直接到达的所有结点,然后在按这些结点被访问的顺序去依次去访问他们能直接到达的所有结点,以此类推,直到所有结点都被访问为止。类似于一颗石头落在水里,水花总是以石头为中心,并以同心圆的方式向外扩散至整个水面。
实现:
广度优先搜索总是用队列来实现,且总是按层次的顺序进行遍历,其基本写法如下:
void BFS(int s){
queue<int> q;
q.push(s);
while(!q.empty()){
取出队首元素top;
访问队首元素top;
将top的下一层结点中未曾入队的结点全部入队,并设置为已入队;
将队首元素出队;
}
}
代码:
/**
输入:第一行输入N,M,X,Y分别表示:N城市数量,M路线数量,X起始城市,Y目标城市
接下来M行表示城市a和城市b之间有路线可以互达。
输出:X到Y最少的转机次数。
**/
#include<bits/stdc++.h>
using namespace std;
int N,M,X,Y;
int e[50][50],book[50];
int head,tail;
const int inf = 99999999;
struct node{
int dis;
int site;
};
int init(){
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(i==j) e[i][j]=0;
else e[i][j]=inf;
}
}
}
int main(){
node que[50];
scanf("%d %d %d %d",&N,&M,&X,&Y);
memset(book,0,sizeof(book));
init();
for(int i=1;i<=M;i++){
int a,b;
scanf("%d %d",&a,&b);
e[a][b]=1;
e[b][a]=1;
}
head=1;
tail=1;
que[tail].site=X;
que[tail].dis=0;
tail++;
book[X]=1;
int flag=0;
while(head<tail){
int cur=que[head].site;
for(int i=1;i<=N;i++){
if(e[cur][i]!=inf&&book[i]==0){
que[tail].site=i;
que[tail].dis=que[head].dis+1;
tail++;
book[i]=1;
}
if(que[tail].site==Y){
flag=1;
break;
}
}
if(flag) break;
head++;
}
printf("%d",que[--tail].dis);
return 0;
}