首先在将算法之前需要先构造无向图,具体请参考上一篇文章《[puzzle-1]无向图的存储方式》.
深度优先搜索算法介绍
深度优先算法类似于 树的先序遍历 :
1、找到一个未被遍历的顶点,如上图V1,首先将V1状态标注为 访问过。
2、找到V1的临界点V2标注为 访问过,找到V2的邻接点V4标注为 访问过,继续找到V4的邻接点V8标注为 访问过,继续找到V8的邻接点V5标注为 访问过。
3、找到V5后,V5没有未被访问过的邻接点了,开始回退,V5退到V8,V8退到V4,V4退到V2,V2退到V1.
4、找到V1的另外一个邻接点V3标注为 访问过,找到V3的邻接点V6标注为 访问过,继续找到V6的邻接点V7标注为 访问过。
5、找到V7后,V7没有被访问过的临界点了,开始回退,V7回退到V6,V6回退到V3,V3回退到V1.
6、查找V1是否还有没有被访问的邻接点,如果有继续重复上述操作,知道所有的邻接点都被访问完毕。
如上图的顶点遍历顺序是:V1->V2->V4->V8->V5->V3->V6->V7
C语言代码实现:
1、声明一个用于存放所有顶点访问状态的数据。
// 顶点访问状态的数组
int vertex_status[MAX_NUM];
2、构建无向图的时候初始化顶点访问状态为0;
// 初始化顶点状态for(i=0;i
3、开始搜索
确保拿到每一个节点,如果当前节点没有访问过,调用 深度优先搜索算法
// 深度搜索启动
void dfs_start(void)
{int i;// 确保获取到每一个顶点 for(i=0;i
4、深度搜索算法函数
// 深入优先搜索
void dfs(int pos)
{// 如果当前顶点没有被访问 if(!vertex_status[pos]) {// 设置顶点访问状态,并输出顶点数据 vertex_status[pos] = 1;printf("%d ",vertex_arr[pos]);// 查找下一个邻接点,调用dfsint i;for(i=0;i
5、main函数调用
int main()
{int res = create_graph();if(res == -1){return -1;}print_graph(); dfs_start();return 0;
}
执行结果: