zoukankan      html  css  js  c++  java
  • 检验深度优先和广度优先的程序(邻接矩阵存储结构)

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


  • 相关阅读:
    Java 多个线程之间共享数据
    Mysql索引为什么要采用B+Tree而非B-Tree
    MyBatis常见面试题:通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
    CentOS 8.1 基于二进制安装docker
    shell实现一键证书申请和颁发脚本
    配置DNS的主从以及实现域名反向解析
    利用Dockerfile实现nginx的部署
    编译安装Mariadb-10.5.5
    登录mysql出错:mysql: error while loading shared libraries: libtinfo.so.5: cannot open share
    一键安装MySQL5.7脚本
  • 原文地址:https://www.cnblogs.com/KongkOngL/p/4074458.html
Copyright © 2011-2022 走看看