好吧,今天看了bfs,其实发现基本思想也是不过如此。只是,应用还是不太会。
bfs是宽度优先,从根节点开始,依次访问它的所有邻接点,然后再按顺序访问邻接点的邻接点,先被访问的点的邻接点先被访问。由于要按这样的顺序访问,所以需要用到队列。
求最短路径和迷宫类型的题目都可以利用Bfs.
下面是基本步骤:
1)从图中的某个顶点v出发,访问v。
2)依次访问V的各个没有被访问过的邻接点。
3)分别从这几个邻接点出发访问他们的邻接点,先被访问的顶点的邻接点先于后被访问的邻接点。重复步骤3)直到图中所有顶点都被访问。
对于队列的使用:
1)先把根节点加入队列。
2)只要队列不为空,就要重复这样的操作:
队头顶点u出列,如果visit[w]显示u的邻接点w没有被访问过,那么访问w,并置visit[w]标记已经访问过,然后w进队列,这样就可以保证寻找邻接点的次序。
#include<iostream>
#include<queue>
using namespace std;
int a[11][11];
bool visited[11];
void store_graph() //用邻接矩阵存储图
{
for(int i=1;i<=10;i++)
for(int j=1;j<=10;j++)
cin>>a[i][j];
}
void bfs_graph() //遍历图
{
void bfs(int v); //函数调用声明
memset(visited,false,sizeof(visited));
for(int i=1;i<=10;i++)
if(visited[i]==false)
bfs(i);
}
void bfs(int v) //广度优先搜索
{
int Adj(int x); //函数调用声明
queue<int> myqueue; //定义一个队列来存储结点
int adj,temp;
cout<<v<<" ";
visited[v]=true;//标记已经被访问过
myqueue.push(v);
while(!myqueue.empty()) //队列非空表示还有顶点未遍历到
{
temp=myqueue.front(); //获得队列头元素
myqueue.pop(); //头元素出队
adj=Adj(temp); //邻接点编号
while(adj!=0)
{
if(visited[adj]==false)
{
cout<<adj<<" ";
visited[adj]=true;
myqueue.push(adj); //进队
}
adj=Adj(temp);
}
}
}
int Adj(int x) //求X的邻接点
{
for(int i=1;i<=10;i++)
if(a[x][i]==1 && visited[i]==false)
return i;
return 0;
}
int main()
{
cout<<"初始化图:"<<endl;
store_graph();
cout<<"bfs遍历结果:"<<endl;
bfs_graph();
return 0;
}