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


    一、试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    [考试反思]1008csp-s模拟测试65:突袭
    [考试反思]1008csp-s模拟测试64:契机
    [考试反思]1007csp-s模拟测试63:朦胧
    [考试反思]1006csp-s模拟测试62:隔断
    [考试反思]1005csp-s模拟测试61:休止
    [毒瘤题]玛里苟斯:线性基,表达式分析,测试点分治
    albus就是要第一个出场:线性基
    [考试反思]1005csp-s模拟测试60:招魂
    [考试反思]1004csp-s模拟测试59:惊醒
    [考试反思]1003csp-s模拟测试58:沉淀
  • 原文地址:https://www.cnblogs.com/lightac/p/13558247.html
Copyright © 2020-2023  润新知