[数据结构] 图DFS和BFS遍历算法
这里简单的用递归算法实现DFS算法;利用队列简单实现BFS算法
DFS算法实现图的邻接矩阵的遍历
原理很简单,先用一个数组标记已经访问过的结点,并且依次递归访问每一个顶点的邻接点直到所有顶点都被访问过为止。
因为在访问每一个顶点时顺便把其编号输出,所有最后得到的就是这整个图的DFS遍历序列。
int Visist[MAX]={0};//定义全局变量观察每一个被访问过的结点
static int _count=0;//记录DFS的输出次数
void DFS(Graph&map,int v) //图的深度优先遍历算法,v表示出发的结点
{
Visist[v]=1;
if(_count<=Lent-2)
cout<<v<<"-->";//输出被访问过的结点编号
else cout<<v<<endl;
++_count;
for(int w=0;w<Lent;++w)
{
if(map.Map[v][w]<INF&&Visist[w]!=1)DFS(map,w);
}
}
DFS算法实现图的邻接矩阵的遍历
- 因为实现图的深度优先遍历(BFS)要用到队列这种数据结构,故先简单创建一下链表队列的数据结构和入队出队的方法。
(也许会有人说为什么不直接用sql库里面的方法?我只能说手写有益大脑2333)
队列的相关方法代码如下,比较简单
//1:定义队列的数据结构
typedef struct QNode
{
int data;
struct QNode*next;
}*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
//队列的初始化
int InitQueue(LinkQueue&q)
{
q.front=q.rear=new QNode;
q.front->next=NULL;
return OK;
}
//入队操作
int push_q(LinkQueue&q,int elemt)
{
QNode* p=new QNode;
p->data=elemt;
p->next=NULL;
q.rear->next=p;
q.rear=p;
return OK;
}
//出队操作
int pop_p(LinkQueue&q)
{
if(q.front==q.rear)return ERRO;//队列空
QNode*p=new QNode;
p=q.front->next;
int e=p->data;
q.front->next=p->next;
if(q.rear==p)q.rear=q.front;
delete p;
return e;
}
接下来是BFS算法实现的详细步骤
- 先让第一个访问的结点入队,紧接着在队列不为空的情况下,依次访问当前结点的每一个邻接点
- 每访问一个结点就将其输出并且入队,最后添加上已经访问的标记
- 访问完当前结点的所有邻接点之后将这个顶点的第一个邻接点出队并对该点执行步骤1直到队空
- 最后你就会得到该图BFS遍历输出序列了,是不是很简单捏。
对了查找当前顶点的每一个邻接点的函数我放在本文最后了,有需要的同学可以看看啊
void BFS(Graph&map,int v)//图的广度优先遍历算法
{
cout<<v<<"-->";
Visist2[v]=1;//表示v结点已经被访问
LinkQueue queue;
InitQueue(queue);//队列的初始化
push_q(queue,v);
int count=1;//记录输出次数
while(queue.front!=queue.rear)//如果队列不为空
{
int u=pop_p(queue);//出队并且设置为u
for(int w=FirstNeighbor(Vex,u);w>=0; w=NextNeighbor(map,u,w))
//依次检查u所有的邻接点w,FirstNeighbor(Vex,u)表示u的第一个邻接点;
//NextNeighbor(map,u,w)表示u相对于w的下一个邻接点
//w>=0表示存在邻接点
if(Visist2[w]!=1)
{
if(count<=Lent-2)
cout<<w<<"-->";
else
cout<<w<<endl;
++count;
Visist2[w]=1;
push_q(queue,w);
}
}
}
下面就是查找邻接点的函数方法啦
int FirstNeighbor(Vertex*&Vet,int v)//查找并返回v的邻接点
{
return Vet[v].approx;//查找图的第一个邻接点
}
int NextNeighbor(Graph&map,int v,int w)//查找并返回v相对于w的下一个邻接点
{
if(map.Map[v][w]<INF)//在v和w互为邻接点的情况下才执行
{
for(int i=w+1;i<Lent;++i)
{
if(map.Map[v][i]<INF)
return i;
}
}
return -1;//表示v和w两点间没有邻接点
}
最后本人是菜鸡一个,大佬勿喷哦~~~