最简洁的广度优先遍历算法模板
广度优先搜索(breadth-first search, BFS)是一种最常见的最简单的搜索算法,但是往往代码看起来都相当的复杂,要做起题目来经常就写不出来,因此得把牺牲一下代码的封装性,可重用性,简化成瞬间能回忆起来的形式。
#include<stdio.h>
//初始化图
const int N=100,V=9,E=15;
char vexs[V]=_______________________________;
int arc[V][V]=______________________________;
//初始化队列
int Queue[N];
int front=1,rear=1;
int visited[V];
//入队
void EnQueue(int i)
{
if((rear+1)%N!=front)
{
Queue[rear]=i;
rear=(rear+1)%N;
}
}
//出队
void DeQueue(int *i)
{
if(front!=rear)
{
*i=Queue[front];
front=(front+1)%N;
}
}
//主函数
int main()
{
int i,j;
//广度优先遍历
for(i=0;i<V;i++)
visited[i]=0;
for(i=0;i<V;i++)
{
if(!visited[i])
{
visited[i]=1;
printf("%c ",vexs[i]);
EnQueue(i);
while(front!=rear)
{
DeQueue(&i);
for(j=0;j<V;j++)
{
if(arc[i][j]==1&&!visited[j])
{
visited[j]=1;
printf("%c ",vexs[j]);
EnQueue(j);
}
}
}
}
}
}
只需要在横线处把图的信息输入就可以了,其中V是顶点数,E是边数,N是循环队列长度。 对于
我们这里采用在main函数里面初始化图
//初始化
arc[0][1]=1;
arc[0][5]=1;
arc[1][2]=1;
arc[1][8]=1;
arc[1][6]=1;
arc[2][3]=1;
arc[2][8]=1;
arc[3][4]=1;
arc[3][7]=1;
arc[3][6]=1;
arc[3][8]=1;
arc[4][5]=1;
arc[4][7]=1;
arc[5][6]=1;
arc[6][7]=1;
for(i = 0; i < V; i++)
{
for(j = i; j < V; j++)
{
arc[j][i] =arc[i][j];
}
}
广度优先搜索结果:
A B F C G I E D H
广度优先搜索算法的基本原理
可以参考算法导论
其中s为根节点,也叫源节点, .d是指到源节点的距离, .π是指父节点是谁,颜色有灰色指被发现还没遍历过和黑色指已遍历
参考资料:
大话数据结构
算法导论