/*图的广度优先遍历算法
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,¤t);//删除队首并将队首的值存入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;
}