检验深度优先和广度优先的程序(邻接矩阵存储结构)

图的遍历
对图的搜索就是对图中顶点的遍历。图中各顶点的关系比较复杂、一个顶点可能有多
个邻接顶点,也可能是独立顶点(非连通图)。为了不重复地访问所有顶点,需设立一个访
问标志数组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


posted @ 2014-08-29 21:19  meiyouor  阅读(309)  评论(0编辑  收藏  举报