图的遍历分为两种,分别是广度搜索优先BFS和深度搜索优先DFS
邻接矩阵表示图的遍历
DFS的遍历与树的先序遍历类似
int visited[Maxnum]; // 用来做标记,值为0表示节点未被访问,1为已被访问
void DFS(Graph G, int Vertex)
{
visited[Vertex] = 1; // 访问节点
printf("%d ", Vertex);
for (int i = 0; i < G->Nv; i++)
{
if (G->Graph[Vertex][i] != 0 && visited[i] == 0)
{
DFS1(G,i);
}
}
}
void ListDFS(Graph G)
{
for (int i = 0; i < G->Nv; i++)
{
if (!visited[i])
{
DFS1(G, i);
}
}
}
BFS遍历 ,与层次遍历类似;使用队列实现
int visited[Maxnum]; // 用来做标记,值为0表示节点未被访问,1为已被访问
void BFS(Graph G, int S)
{
int V;
queue<int> q;
visited[S] = 1; // 访问节点;
printf("%d ",S);
q.push(S); // 入队;
while (!q.empty())
{
V = q.front();
q.pop();
for (int i = 0; i < G->Nv; i++)
{
if (G->Graph[V][i] != 0 && visited[i] == 0)
{
visited[i] = 1; //访问
printf("%d ", i);
q.push(i); //入队
}
}
}
}
void ListBFS(Graph G)
{
for (int i = 0; i < G->Nv; i++)
{
if (!visited[i])
{
BFS1(G, i);
}
}
}
邻接表的DFS与BFS的遍历
DFS的遍历
bool visited[Maxnum]; // 用来做标记,值为false表示节点未被访问,true为已被访问
void DFS(Graph G, int Vertex)
{
//从Vertex顶点开始进行深度优先搜索
ptrNode W;
visited[Vertex] = 1;
printf("%d ", Vertex);
for (W = G->G[Vertex].first; W; W = W->next)
{
if (!visited[W->v])
{
DFS(G, W->v);
}
}
}
void ListDFS(Graph G)
{
for (int i = 0; i < G->Nv; i++)
{
if (!visited[i])
{
DFS(G, i);
}
}
}
BFS的遍历
void BFS(Graph G, int i)
{
queue<int> q;
ptrNode W;
int V;
q.push(i);
visited[i] = 1;
printf("%d ", i);
while (!q.empty())
{
V = q.front();
q.pop();
for (W = G->G[V].first; W; W = W->next)
{
if (!visited[W->v])
{
visited[W->v] = 1;
printf("%d ", W->v);
q.push(W->v);
}
}
}
}
void ListBFS(Graph G)
{
for (int i = 0; i < G->Nv; i++)
{
if (!visited[i])
{
BFS(G, i);
}
}
}