BFS广度优先遍历算法

/*图的广度优先遍历算法
author:wuzuquan
last modify:2008-1-8
*/
#include <stdlib.h>
#include <stdio.h>
#include "queue.h"//specify the queue structure
#define VNUM 8 //定义顶点的个数
#define MAX ((VNUM)*(VNUM))

#define WHITE 0
#define GRAY 1
#define BLACK 2

#define INFINITE 10000//定义无穷远的距离
#define INIT 10000//无父结点
int list[20]={ 1,4,
             5,0,
             3,5,6,
             2,6,7,
             0,
             1,2,6,
             2,3,5,7,
             3,6};//邻接表表示输入图
int head[VNUM+1]={0,2,4,7,10,11,14,18,20};//r s t u v w x y z在list中的起始位置

int color[VNUM];//顶点u颜色储存于color[u]中
int parent[VNUM];//顶点u的父母存储于parent[u]中
int d[VNUM];//算法技术出来的源顶点S和顶点u的距离存储于d[u]中

void bfs(int *list,int source)
{
 int i=0,u=0;
 int current;//current vertex
 Queue *Q=NULL;//定义一个FIFO的队列
 for(;i<VNUM;i++)
 {//initialize
  if(i==source)
  continue;
  color[i]=WHITE;
  d[i]=INFINITE;//无穷远的距离
  parent[i]=INIT;//表示没有父结点
 }
 //对源顶点进行初始化
 color[source]=GRAY;
 d[source]=0;
 parent[source]=INIT;
 
 Q=EnQueue(Q,source);//将source插入队列
 while(Q!=NULL)
 {
  Q=DeQueue(Q,&current);//删除队首并将队首的值存入U中
  for(i=head[current];i<head[current+1];i++)
  {//遍历各个与current相连的顶点
   u=list[i];
   if( color[u] == WHITE )
   {
    color[u]=GRAY;
    d[u]=d[current]+1;
    parent[u]=current;
    Q=EnQueue(Q,u);//将current的邻接顶点插入队列
   }
  }
  color[current]=BLACK;
  printQueue(Q);//输出当前队列的元素
 }
}

void find_path(int *parent,int dest)
{//回溯法,从source到dest的最短路径
 int p=dest;
 while(p!=INIT)
 {
  printf("%d--",p);
  p=parent[p];
 }
}


int main()
{
 int source=1;
 int i=0;
 bfs(list,source);//执行广度优先遍历
 for(;i<VNUM;i++)
 {
  printf("d[%d]=%d %d/n",i,d[i],parent[i]);
 }
 find_path(parent,4);
 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值