#include<stdio.h>
#define N 100
/**DFS深度优先搜索是从图中的某个顶点出发,先访问初始点,然后访问其邻接点u(没有被访问过,下同),
再访问u的邻接点,一直到深入访问*/
//邻接表结构
typedef struct Anode
{
int adj; //终点位置
struct Anode *next;//下一条边
}ArcNode;
typedef struct
{
ArcNode *firstarc; //头结点
}VNode;
typedef VNode AdjList[N];
typedef struct
{
AdjList adjlist;
int n; //图的顶点数
}ALGraph;
int visted[N];
void DFS(ALGraph *g,int v)
{
for (int i=0;i<g->n;i++)visted[i] = 0; //初始化visted数组,用以记录该顶点是否被访问过
visted[v] = 1; //访问初始点
ArcNode *p = g->adjlist[v].firstarc;
while(p!=NULL)
{
if (visted[p->adj]==0) //如果没有被访问过,则递归调用DFS访问
DFS(g,p->adj);
p = p->next; //继续下一条边
}
}
/**BFS广度优先搜索,即先访问初始点v的所有没有被访问过的顶点,再一层一层向外扩张,可以采用队列来记录*/
void BFS(ALGraph *g,int v)
{
for (int i=0;i<g->n;i++)visted[i] = 0;
int queue[N],front,rear;
front = rear = 0;
rear = (rear+1)%N;
queue[rear] = v; //v顶点入队
int u;
ArcNode *p;
while(front!=rear)//当队列不空时
{
front = (front+1)%N;
u = queue[front];
p = g->adjlist[u].firstarc;
while(p!=NULL) //首先访问u的所有节点
{
if (visted[p->adj]==0)
{
visted[p->adj] = 1; //访问p->adj节点,标记为访问
rear = (rear+1)%N;
queue[rear] = p->adj; //p->adj节点入队
}
p = p->next;
}
}
}
BFS和DFS模板
最新推荐文章于 2024-08-10 22:12:42 发布