图的DFS,BFS
邻接表存储
BFS(!需要借助队列Q ):
- G进入BFSTraverse():初始化标记数组visited[],初始化对列Q,for循环if(结点v未访问),则进入BFS()
- G,v进入BFS():访问v,更新visited[],v入队Q
- while(Q非空),则for() 循环遍历v的每一个邻接结点,若结点i未访问,则对其访问,更新状态并入队Q.
DFS:
- G进入DFSTraverse(): 初始化标记数组visited[],for循环if(结点v未访问),则进入DFS()
- G,v进入DFS():访问v,更新visited[]
- for() 循环遍历v的每一个邻接结点,若结点i未访问,则对G,i进入DFS().
#include <stdio.h>
#define MaxSize 100
typedef struct ArcNode{
int adjvex;
struct ArcNode *next;
}ArcNode;
typedef struct VNode{
char data;
ArcNode *first;
}VNode;
typedef struct{
VNode vertices[MaxSize];
int vexnum, arcnum;
}Graph;
bool visit();
void BFSTraverse(Graph G);
void BFS(Graph G,int i);
int FirstNeighbor(Graph G,int v);
int NexNeighbor(Graph G,int v,int w);
int main()
{
Graph G;
BFSTraverse(G);
}
int FirstNeighbor(Graph G,int v)
{
if(G.vertices[v].first != NULL)
{
return G.vertices[v].first.adjvex;
}
return -1;
}
int NexNeighbor(Graph G,int v,int w)
{
ArcNode *p = G.vertices[v].first;
while(p->adjvex != w && p->next != NULL)
{
p = p->next;
}
if(p->next == NULL)
return -1;
else
return p->next->adjvex;
}
void BFSTraverse(Graph G)
{
int visited[MaxSize] = {0};
int i;
InitQueue(Q);
for(i = 0; i < G.vexnum; i++)
{
if(!visited[i])
{
BFS(G,i);
}
}
}
void BFS(Graph G, int v){
visit(v);
visited[v]=1;
EnQueue(Q,v);
while(!isEmpty(Q))
{
DeQueue(Q,v);
for(w = FirstNeighbor(G,v); w >= 0; w = NexNeighbor(G,v,w))
{
visit(w);
visited[w] = 1;
EnQueue(Q,w);
}
}
}
void DFSTraverse(Graph G){
int visited[G.vexnum] = {0};
for(v = 0; v < G.vexnum; v++)
{
if(!visited[v])
{
DFS(G,v);
}
}
}
void DFS(Graph G, int v){
visit(v);
visited[v] = 1;
for(w = FirstNeighbor(G,v); w >= 0; w = NextNeighbor(G,v,w))
if(!visited[w])
{
DFS(G,w);
}
}