您的位置:首页 > 其它

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

2014-08-29 21:19 253 查看
图的遍历

对图的搜索就是对图中顶点的遍历。图中各顶点的关系比较复杂、一个顶点可能有多

个邻接顶点,也可能是独立顶点(非连通图)。为了不重复地访问所有顶点,需设立一个访

问标志数组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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐