图的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
{
char Vex[MaxSize];
int Edge[MaxSize][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)
{
for(int i = 0; i < G.vexnum; i++)
{
if(G.Edge[v][i] == 1 && visited[i] == 0)
{
return i;
}
}
return -1;
}
int NexNeighbor(Graph G,int v,int w)
{
for(int i = w+1, i < G.vexnum; i++)
{
if(G.Vex[v][i] == 1 && visited[i] == 0)
{
return i;
}
}
return -1;
}
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);
}
}