这篇专栏记录的是图的深度优先搜索算法(DFS)。(完整代码在最下面)
存储图,首先要定义边、顶点、图的结构体。
//边
typedef struct Edge{
int adj; //邻接点对应的的下标
Edge *next; //指向下一个结点
}Edge;
//顶点
typedef struct{
int data; //顶点信息
Edge *first; //指向第一个邻接点
}Node;
//图
typedef struct{
Node Node[15]; //顶点
int numVertex, numEdge; //顶点数,边数
}Graph;
由于访问节点不能重复,因此要定义一个数组来标记该顶点是否已经访问。
bool DFSvisited[50]; //标记结点是否被访问过
创建的图和存储图对应的邻接表如图所示。
执行顺序:
1、先访问Node[0].data(即1)。
2、由于Node[0].first.adj为1,所以访问Node[1].data(即2)。
3、由于Node[1].first.adj为4,所以访问Node[4].data(即5)。
4、由于Node[4].first为NULL,回退到Node[1].first。
5、由于Node[1].first.next为NULL,回退到Node[0].first。
6、由于Node[0].first.next.adj为2,所以访问Node[2].data(即3)。
7、由于Node[2].first为NULL,回退到Node[1].first.next。
8、由于Node[1].first.next.next.adj为3,所以访问Node[3].data(即4)。
9、由于Node[3].first已经访问过,回退,发现每一个顶点都访问过了。
完整代码:
#include <iostream>
using namespace std;
bool DFSvisited[50]; //标记结点是否被访问过
//边
typedef struct Edge{
int adj; //邻接点对应的的下标
Edge *next; //指向下一个结点