参考书:
《啊哈算法第五章:图的遍历》
《第一节。深度优先和广度优先究竟是啥》——广度优先 实现图的遍历
广度优先算法实现图的遍历代码如下:
#include <iostream>
using namespace std;
int book[101], n = 5, e[101][101]; //n为顶点个数
int que[10001], cur=1, head=1, tail=1;
void bfs(int cur) //广度优先搜索
{
while(head<tail)
{
cur = que[head]; //当前正在访问的顶点编号
for(int i=1;i<=n;i++)
{
//判断当前顶点cur与顶点i是否有边相连,并判断顶点i 是否已经访问过
if(e[cur][i]==1&&book[i]==0)
{
que[tail]=i;
tail++;
book[i]=1; //标记顶点i已经访问过
}
if(tail>n)
break;
}
head++; //一个顶点扩展结束后,才head++。然后继续往下扩展。
}
return;
}
void myPrint(int que[])
{
for(int i=1;i<tail;i++)
{
cout<<que[i]<<" ";
}
}
int main()
{
//定义一个二维数组表示顶点之间边
int bian[5][2]={{1,2},{1,3},{1,5},{2,4},{3,5}}; //边的个数
int num=sizeof(bian)/sizeof(bian[0]); //边的个数
//初始化二维矩阵e
for(int i=1;i<=num;i++)
{
for(int j=1;j<=num;j++)
{
if(i==j)
e[i][j]=0;
else
e[i][j]=99999999;
}
}
for(int i=1;i<=num;i++)
{
e[bian[i-1][0]][bian[i-1][1]]=1;
e[bian[i-1][1]][bian[i-1][0]]=1;
}
//从1号顶点出发,将1号顶点加入队列。
que[tail]=1;
tail++;
book[1]=1;
// int cur=1;
bfs(cur);
myPrint(que);
cout<<endl;
system("pause");
return 0;
}
运行结果:
1 2 3 5 4
请按任意键继续. . .