poj2386--图的遍历
题意描述:要求输出图中连通分支的个数。
最简单的图遍历问题,题目虽然简单,却考察了最基本的遍历知识。
图的常见遍历方式有两种:深度优先遍历和广度优先遍历,他们的作用是将图中的每个点都访问一遍,只不过是顺序不同。
如果把图中的每条边长都相等(比如都是1)的话,深度优先遍历的过程是:
1.任意选定一个点p0作为遍历的起点
2.从未访问节点中任选一个距离p0最近的点进行访问,并标记该点被访问过
3.重复第2步,直到该连通分支中的所有节点都被访问过
说的形象一点,深度优先遍历就是按照层次的顺序访问节点,每一层中的节点与p0有相同的距离。先访问第一层,再访问第二层,……
深度优先遍历过程就是尽可能深的去访问节点,具体过程为:
1.任意选定一个点p0作为遍历的起点
2.当访问到某一个节点p1时,如果p1下面有未被遍历的子节点,我们就接着访问p1的某一个未被遍历子节点,并标记该子节点被访问过,
3.如果p1不存在未被访问的子节点,我们就退回到p1的父节点,并执行第2步
4.执行第2、3步,直到所有节点被访问过。
(递归过易做图心不好描述啊~~~)
大家也看出来了,深度优先遍历的是一个递归的过程,因此很容易想到要用到栈这种数据结构,具体实现的时候可以用递归,也可以用栈。看个人习惯了。
广度优先遍历实现就要用到队列了。
以下是poj2386不同实现方式的代码
深度优先遍历,递归实现:
深度优先遍历,栈实现:
广度优先遍历:
补充:软件开发 , C++ ,