和上一篇的二叉树层次遍历几乎一致。
#include<stdio.h>
#define N 8
int g[N][N]=
{
{0,1,0,0,1,0,0,0},
{1,0,0,0,0,1,0,0},
{0,0,0,1,0,1,1,0},
{0,0,1,0,0,0,1,1},
{1,0,0,0,0,0,0,0},
{0,1,1,0,0,0,1,0},
{0,0,1,1,0,1,0,1},
{0,0,0,1,0,0,1,0}
};
char gr[N]={'r','s','t','u','v','w','x','y'};//各顶点
int main()
{
char color[N]={'w','w','w','w','w','w','w','w'};//初始颜色为白色
int d[N]={1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6};//里源点的距离
char p[N]={'#','#','#','#','#','#','#','#'};
int q[N]={'#','#','#','#','#','#','#','#'};//模拟队列
int i=0,k=0,u=0;
color[1]='g';//1是源点
d[1]=0;
p[1]='#';//源点无父母
q[i]=1;
puts("BFS遍历:");
while(k<N)
{
printf("%c",gr[q[k]]);
if(k<N-1)
printf(" -> ");
u=q[k++];
for(int v=0;v<N;v++)
{
if(g[u][v]==1)
{
if(color[v]=='w')
{
color[v]='g';//其实等价于是否还在队列中 完全可以不用颜色的
d[v]=d[u]+1;
p[v]=gr[u];
q[++i]=v;
}
}
}
color[u]='b';//出队变成黑色
}
puts("\n离源点距离:");
for(int i=0;i<N;i++)
printf("d[%c]=%d\t",gr[i],d[i]);
puts("\n父母:");
for(int i=0;i<N;i++)
printf("p[%c]=%c\t",gr[i],p[i]);
getchar();
return 0;
}