• 数据结构与算法参考答案(第十一周)


    一、试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点vivj的路径(i≠j)。注意算法中涉及的图的基本操作必须在此存储结构上实现。

    答:

    本题需要以邻接表的方式来实现DFS算法从而判断是否存在从一点到另一点的路径。由所学知识可以知道,实现DFS方式的方式有两种,用栈或者递归的方式。在这道题,使用递归的方式进行实现。

    该算法实现的伪代码如下:

    /*

        函数名称:给定图中,判断给定两点之间是否存在路径

        传入参数:图G,起点start,终点end

        返回值:bool型 如果有返回true,否则返回false

    */

    bool DFS(Graph G, int start, int end) {

        EdgeNode *p;

        //如果找到了路径返回真

        if(start == end) {

            return true;

        }

        //标记起始点

        visited[start] = true;

        p = G.adjlist[start].firstedge;  //得到与起始点相连的边

        while(p) {

            int index = p -> adjVexIndex;   //获得该边对应的标号

            if(!visited[index] && DFS(G, index, end)) { //利用递归的方式继续进行寻找

                return true;

            }

            p = p -> next;

        }

        return false;   //如果找到最后也没找到证明没有路径

    }

    算法分析:由所学知识,我们能很容易知道DFS时间复杂度为O(n+e)。如果直接使用暴力搜索的话,会造成巨大的时间开销。综上,这是解决该问题的较好的方法。

    作者:LightAc
    出处:https://www.cnblogs.com/lightac/
    联系:
    Email: dzz@stu.ouc.edu.cn
    QQ: 1171613053
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    Java实现 LeetCode 61 旋转链表
    Java实现 LeetCode 60 第k个排列
    Java实现 LeetCode 60 第k个排列
    Java实现 LeetCode 60 第k个排列
    Java实现 LeetCode 59 螺旋矩阵 II
    VC 2005 解决方案的目录结构设置和管理
    Visual C++ 设置适合自己的解决方案目录结构
    瑞蓝RL-NDVM-A16网络视频解码器 视频上墙解决方案专家--数字视频解码矩阵
    为什么类的定义中不能包含其自身类型,但是能包含其自身的指针或引用类型
    C++模板使用介绍
  • 原文地址:https://www.cnblogs.com/lightac/p/13558247.html
Copyright © 2020-2023  润新知