首页 > 编程语言 >【408DS算法题】039进阶-判断图中路径是否存在

【408DS算法题】039进阶-判断图中路径是否存在

时间:2024-09-09 23:49:32浏览次数:3  
标签:进阶 408DS int stop start 039 visited true cur

Index

题目

对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。

分析实现

对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图)

1.图的BFS

BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

具体实现如下:

// BFS版本判断路径存在
bool hasPathBFS(Graph& G, int start, int stop){
    if (start == stop)
        return true;
        
    vector<bool> visited(G.vexnum, false);
    queue<int> q;
    q.push(start);
    visited[start] = true;
    
    while(!q.empty()){
        int cur = q.front();
        q.pop();
        for(int i=0; i<G.vexnum; i++){
            // 没有边
            if(G.edge[cur][i] == 0){
                continue;
            }
            // 找到路径
            if(i == stop){
                return true;
            }
            if(!visited[G.edge[cur][i]]){
                q.push(i);
                visited[i] = true;
            }
        }
    }
    return false;
}

2.图的DFS

理解的图DFS版本的思想,首先需要根据递归的思想,推理出递归函数的作用——判断图中是否存在路径cur->stop,再将这一“功能”运用到遍历中,思路就会非常简单。

具体实现如下:

// DFS实现辅助函数
bool hasPathDFSUtil(Graph& G, int cur, int stop, vector<bool>& visited){
    if(cur == stop){
        return true;
    }
    visited[cur] = true;
    for(int i = 0; i < G.vexnum; i++){
        // 重点递归判断 - 存在边[cur-i] + 未访问过i + *存在路径[i-stop]
        if(G.edge[cur][i] == 1 && !visited[i] 
            && hasPathDFSUtil(G, i, stop, visited)){
            return true;
        }
    }
}
// DFS判断路径存在
bool hasPathDFS(Graph& G, int start, int stop){
    vector<bool> visited(G.vexnum, false);
    return hasPathDFSUtil(G, start, stop, visited);
}

总结

以上就是通过BFS和DFS两种方式实现的图的路径的存在性判断。

对于递归函数,刚开始尝试的时候总是会想不到思路。
对此,只需去想递归函数的统一的实现思路——假设函数功能已经实现,先写出递归基,再运用“更小规模”的函数调用来实现递归函数。

标签:进阶,408DS,int,stop,start,039,visited,true,cur
From: https://blog.csdn.net/weixin_60702024/article/details/142035214

相关文章

  • Python编程 - 进阶面向对象
    目录前言一、多态(一)多态的示例(二)多态的优势(三)总结二、静态方法(一)定义(二)特点(三)总结三、类属性(一)定义(二)类属性和实例属性的区别(三)使用场景(四)总结四、类方法(一)类方法的特点(二)定义类方法(三)使用场景(四)总结五、类对象(一)创建类对象(二)类对象的特性(三)类对象的使......
  • SciTech-Mathmatics-Probability+Statistics-Population-Sampling-Population vs. Sam
    Difference:Populationvs.SampleBYZACHBOBBITTPOSTEDONNOVEMBER27,2020Ofteninstatisticswe'reinterestedincollectingdatasothatwecananswersomeresearchquestion.Forexample,wemightwanttoanswerthefollowingquestions:Whatis......
  • FastAPI 进阶:使用 BackgroundTasks 处理长时间运行的任务
    在FastAPI中,BackgroundTasks是一个功能,它允许你在发送响应给客户端之后执行后台任务。这些任务对于不需要客户端等待的操作非常有用,比如发送电子邮件通知或处理数据。然而,当服务器重启时,由于BackgroundTasks是与单个应用实例的生命周期相关联的,它们不会自动恢复执行。Backgrou......
  • 20240904_192638 mysql 填空题 存储过程进阶
    定义一个存储过程的形参,它接收数据,参数名为id,为int类型inidint定义一个存储过程的形参,它返回数据,参数名为name,是varchar(5)类型outnamevarchar(5)定义一个存储过程的形参,它一边接收数据一边返回数据,参数名为num,是int类型inoutnumint声明一个名为info的游标,保存查询teac......
  • E. Klee's SUPER DUPER LARGE Array!!!
    原题链接题解发现随着\(i\)越大,绝对符号内的值越大,因此具有单调性,可以应用二分查找找离0最近的\(i\)而值可以用等差数列求和公式快速求出code#include<bits/stdc++.h>usingnamespacestd;/*mt19937_64rnd(time(0));#definedoublelongdouble#definelowbit(x)......
  • redis订阅者和进阶
    Redis进阶redis订阅者模式简介redis存在订阅者模式。就像是一个广播系统。存在三种角色:订阅者、发布者、频道。在redis当中,它们表示为subscriber(订阅者)、publisher(发布者)、channel(频道)其中的行为大抵是:订阅者订阅频道-->发布者针对于特定频道发布信息-->特定订阅者......
  • C++ 模板进阶知识——stdenable_if
    目录C++模板进阶知识——std::enable_if1.简介和背景基本语法使用场景2.`std::enable_if`的基本用法示例:限制函数模板只接受整数类型3.SFINAE和std::enable_if示例:使用SFINAE进行函数重载SFINAE的优点应用场景4.在类模板中使用std::enable_if示例:根据类型......
  • 【转】数据模型——从D模型到C/C'模型的浅谈
    数据模型——从D模型到C/C'模型的浅谈原文链接:https://zhuanlan.zhihu.com/p/521380989DSColloquium在DA和ML中寻找life的wisdom(真香~)​关注 15人赞同了该文章一、引言在日常企业运营和发展过程中,总会遇到这么一个情景:已有的业务系统的设计与实施......
  • python3 ModuleNotFoundError: No module named 'CommandNotFound'
    前言python3报错:ModuleNotFoundError:Nomodulenamed'CommandNotFound'这是linux安装多版本python时的一个遗留问题,如果修改了默认系统的/usr/bin/python的软连接到新安装的版本,然后在/usr/bin下将名为python3的软链接指向了新版本的python。因为Python版......
  • python3 报错ModuleNotFoundError: No module named 'apt_pkg'
    前言aptupdate无法执行,python3报错ModuleNotFoundError:Nomodulenamed'CommandNotFound'这是因为将python版本升级后的问题正确做法将路径:/usr/lib/python3/dist-packages下的文件apt_pkg.cpython-36m-x86_64-linux-gnu.so,文件名没有跟随python版本进行更改,正确做......