检验深度优先和广度优先的程序(邻接矩阵存储结构)
图的遍历
对图的搜索就是对图中顶点的遍历。图中各顶点的关系比较复杂、一个顶点可能有多
个邻接顶点,也可能是独立顶点(非连通图)。为了不重复地访问所有顶点,需设立一个访
问标志数组visited[],并置其初值为FALSE(未被访问)。遍历时只访问那些未被访问过的
顶点,且在访问后,将其访问标志的值改为TRUE。当所有顶点访问标志的值都为
TRUE,则图已遍历。遍历一般从图的第1 个顶点开始。确定遍历顶点有两个搜索原则:
代码的运行结果:
请输入数据文件名(f7-1.txt或f7-2.txt):f7-1.txt
8个顶点14条边或弧的无向图。顶点依次是: a b c d e f g h
G.arcs.adj:
0 1 1 0 1 1 1 1
1 0 0 1 1 0 0 1
1 0 0 0 0 0 1 1
0 1 0 0 0 0 0 1
1 1 0 0 0 1 0 0
1 0 0 0 1 0 1 0
1 0 1 0 0 1 0 0
1 1 1 1 0 0 0 0
G.arcs.info:
顶点1(弧尾) 顶点2(弧头) 该边或弧的信息:
深度优先搜索的结果:
a b d h c g f e
修改顶点的值,请输入原值新值: e E
删除一条边或弧,请输入待删除边或弧的弧尾弧头:a b
广度优先搜索的结果:
a c E f g h b d
对图的搜索就是对图中顶点的遍历。图中各顶点的关系比较复杂、一个顶点可能有多
个邻接顶点,也可能是独立顶点(非连通图)。为了不重复地访问所有顶点,需设立一个访
问标志数组visited[],并置其初值为FALSE(未被访问)。遍历时只访问那些未被访问过的
顶点,且在访问后,将其访问标志的值改为TRUE。当所有顶点访问标志的值都为
TRUE,则图已遍历。遍历一般从图的第1 个顶点开始。确定遍历顶点有两个搜索原则:
深度优先搜索和广度优先搜索。
深度优先搜索
算法7.4、7.5 是利用递归对图进行深度优先搜索的算法,它的主要思想是:先访问图
的第1 个顶点,然后访问这个顶点的第1 个邻接顶点,再访问第1 个邻接顶点的第1 个邻接
顶点。如果这个顶点被访问过了,就访问第2 个邻接顶点,⋯⋯ 所谓第1 个邻接顶点、第
2 个邻接顶点不是由图的拓扑关系决定的,它取决于图的存储结构。即使是同一个图,如果
它的存储结构不同,那么它的某个顶点的第1 个邻接顶点、第2 个邻接顶点也可能不同。关
于这一点,将在后面algo7-10.cpp、algo7-11.cpp 中根据实例做进一步的说明。算法7.4、
7.5 是基于基本操作的,与图的具体存储结构无关,所以很容易移植到各种存储结构中,只
要那种存储结构的有关基本操作函数存在即可。在bo7-1.cpp~bo7-4.cpp 中都有实现算法
7.4 和算法7.5 的函数。
广度优先搜索
算法7.6 是对图进行广度优先搜索的算法,它的主要思想是:先访问图的第1 个顶
点,然后依次访问这个顶点的所有邻接顶点,再依次访问这些邻接顶点的所有邻接顶点。
这需要建立1 个先进先出的队列,依次将访问过的顶点入队。当前1 个顶点的所有邻接顶
点都被访问了,就出队1 个顶点,再访问这个顶点的所有邻接顶点且将它们入队。直至所
有顶点都被访问过。算法7.6 也是基于基本操作的,在bo7-1.cpp~bo7-4.cpp 中也都有实
现算法7.6 的函数。algo7-10.cpp 是在邻接矩阵的存储结构下,调用算法7.4、7.5 和
7.6,对图进行深度优先搜索和广度优先搜索的程序。
// algo7-10.cpp 检验深度优先和广度优先的程序(邻接矩阵存储结构) #include"c1.h" #define MAX_NAME 5 // 顶点字符串的最大长度+1 #define MAX_INFO 20 // 相关信息字符串的最大长度+1 typedef int VRType; // 顶点关系类型 typedef char InfoType; // 相关信息类型 typedef char VertexType[MAX_NAME]; // 顶点类型 #include"c7-1.h" // 邻接矩阵存储结构 #include"bo7-1.cpp" // 邻接矩阵存储结构的基本操作 void visit(VertexType i) { printf("%s ",i); } void main() { MGraph g; VertexType v1,v2; CreateFUDG(g); // 利用数据文件创建无向图,在bo7-1.cpp中 Display(g); // 输出无向图,在bo7-1.cpp中 printf("深度优先搜索的结果:\n"); DFSTraverse(g,visit); // 在bo7-1.cpp中 printf("修改顶点的值,请输入原值新值: "); scanf("%s%s",v1,v2); PutVex(g,v1,v2); // 在bo7-1.cpp中 printf("删除一条边或弧,请输入待删除边或弧的弧尾弧头:"); scanf("%s%s",v1,v2); DeleteArc(g,v1,v2); // 在bo7-1.cpp中 printf("广度优先搜索的结果:\n"); BFSTraverse(g,visit); // 在bo7-1.cpp中 }
代码的运行结果:
请输入数据文件名(f7-1.txt或f7-2.txt):f7-1.txt
8个顶点14条边或弧的无向图。顶点依次是: a b c d e f g h
G.arcs.adj:
0 1 1 0 1 1 1 1
1 0 0 1 1 0 0 1
1 0 0 0 0 0 1 1
0 1 0 0 0 0 0 1
1 1 0 0 0 1 0 0
1 0 0 0 1 0 1 0
1 0 1 0 0 1 0 0
1 1 1 1 0 0 0 0
G.arcs.info:
顶点1(弧尾) 顶点2(弧头) 该边或弧的信息:
深度优先搜索的结果:
a b d h c g f e
修改顶点的值,请输入原值新值: e E
删除一条边或弧,请输入待删除边或弧的弧尾弧头:a b
广度优先搜索的结果:
a c E f g h b d
每当夜深人静的时候,想想今天发生了什么,失去了什么,得到了什么,做了什么,没做什么,该做什么,不该做什么,明天要做什么!