当进行一个图的遍历时,我们通常会用bfs的方法进行访问节点。以下案例就是一个典型的宽度优先(bfs)算法的介绍。
此代码输入的格式数据为:
0 1 0 0 1 0
1 0 1 0 1 0
0 1 0 1 0 0
0 0 1 0 1 1
1 1 0 1 0 0
0 0 0 1 0 0
输出答案为:
1 2 5 3 4 6
#include<stdio.h>
#include<iostream>
#include<cstring>
#include<queue>
#define Max 6
using namespace std;
int mart[Max][Max];
/*void bfs(int start)
{
int queue[6]={0};
int vis[6]={0};
int head=0;
int tail=0;
queue[tail++]=start;
vis[start]=1;
while(head!=tail){
//出队
int v=queue[head++];
printf("%d\n",v+1);
for(int i=0;i<Max;i++){
if(mart[v][i]==1){
//入队
if(vis[i]==0){
queue[tail++]=i;
vis[i]=1;
}
}
}
}
}
*/
void bfs(int start){
queue<int> q;//创建队列
int vis[6]={0};//创建标记数组
q.push(start);//将头入队
vis[start]=1;//将头标记
while(!q.empty()){//判断队列是否为空
int v=q.front();//将头取出
q.pop();//出队
printf("%d\t",v+1);//打印
for(int i=0;i<Max;i++)//循环判断与头相连的节点
{
if(mart[v][i]==1) //1是节点
{
if(vis[i]==0){//如果未标记将此节点入队
q.push(i);//入队
vis[i]=1;//标记
}
}
}
}
}
int main()
{
int i,j;
//freopen("data.txt","r",stdin);
for(i=0;i<Max;i++)
{
for(j=0;j<Max;j++)
{
scanf("%d",&mart[i][j]);
}
}
bfs(0);
}
该方法是自己的感悟,如有不足欢迎联系作者。