BFS广度优先遍历算法

来源:互联网 发布:索尼淘宝签约店 编辑:程序博客网 时间:2024/04/29 09:31

/*图的广度优先遍历算法
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;
}

 

原创粉丝点击