【代码随想录训练营第42期 Day53打卡 - 图论Part4 - 卡码网 110. 字符串接龙 105. 有向图的完全可达性

news2024/12/24 10:08:11

目录

一、个人感受

二、题目与题解

题目一:卡码网 110. 字符串接龙

题目链接

题解:BFS+哈希

题目二:卡码网 105. 有向图的完全可达性

题目链接

题解:DFS

三、小结


一、个人感受

对于两大基本搜索:

深度优先搜索DFS遍历所有路径,每条路径都是一条路走到底,用于解决需要处理所有位置的情况;
广度优先搜索BFS遍历最近相邻路径(常用邻接图,邻接表实现),用于用于求得最短路径,最小次数等。

今天打卡题目个人感觉挺难,事实证明,图论这个章节还得多练。

二、题目与题解

题目一:卡码网 110. 字符串接龙

题目链接

110. 字符串接龙 (kamacoder.com)

题目描述

字典 strList 中从字符串 beginStr 和 endStr 的转换序列是一个按下述规格形成的序列:

1. 序列中第一个字符串是 beginStr。

2. 序列中最后一个字符串是 endStr。

3. 每次转换只能改变一个字符。

4. 转换过程中的中间字符串必须是字典 strList 中的字符串,且strList里的每个字符串只用使用一次。

给你两个字符串 beginStr 和 endStr 和一个字典 strList,找到从 beginStr 到 endStr 的最短转换序列中的字符串数目。如果不存在这样的转换序列,返回 0。

输入描述

第一行包含一个整数 N,表示字典 strList 中的字符串数量。 第二行包含两个字符串,用空格隔开,分别代表 beginStr 和 endStr。 后续 N 行,每行一个字符串,代表 strList 中的字符串。

输出描述

输出一个整数,代表从 beginStr 转换到 endStr 需要的最短转换序列中的字符串数量。如果不存在这样的转换序列,则输出 0。

输入示例

6
abc def
efc
dbc
ebc
dec
dfc
yhn

输出示例

4

提示信息

从 startStr 到 endStr,在 strList 中最短的路径为 abc -> dbc -> dec -> def,所以输出结果为 4,如图:

数据范围:

2 <= N <= 500

题解:BFS+哈希

这题的思路其实很简单,需要我们求得从 beginStr 转换到 endStr 需要的最短转换序列中的字符串数量,即是求得最短路径 -- 对于求得最短路径,优先选择 BFS

关键:如何确定是否当前单词改掉一个字母可以得到目标单词?两层循环:尝试用26个字母去替代每个位置的字母,看是否满足。

广度优先搜索(BFS)的实现思路:

        当队列不为空时,取出队头单词word并获取其路径长度path;

        遍历单词word的每个字符位置i,尝试用字母表中的每个字母替换当前位置的字符,生成新的单词newWord;

       如果newWord与目标单词endStr相同,则输出路径长度path +1并结束程序;

       如果newWord在单词集合strSet中且未被访问过(不在visitMap中),则将newWord加入队列,并在visitMap中记录其路径长度为path + 1。

两个哈希:

使用一个unordered_set来存储所有合法的单词,方便后续快速查找;-- strSet

使用一个unordered_map来记录每个单词是否被访问过,以及到达该单词的路径长度。 -- visitMap

代码如下

#include <bits/stdc++.h>
using namespace std;

int n;
string beginStr, endStr;
string str;
int main()
{
    cin >> n;                     // 读取单词的数量
    unordered_set<string> strSet; // 用于存储所有单词的集合
    cin >> beginStr >> endStr;    // 读取起始单词和目标单词
    for (int i = 0; i < n; i++)
    {
        cin >> str; // 读取每个单词str并添加到集合strSet中
        strSet.insert(str);
    }
    // visitMap用于记录每个单词是否被访问过,以及记录到达该单词的路径长度
    unordered_map<string, int> visitMap;             // <单词,路径长度> -- key为单词,value为路径长度
    visitMap.insert(pair<string, int>(beginStr, 1)); // 初始化visitMap,记录起始单词的路径长度为1

    queue<string> q;  // 初始化队列q,用于实现BFS
    q.push(beginStr); // 将起始单词加入队列
    while (!q.empty())
    {
        string word = q.front();              // 获取队头的单词
        q.pop();                              // 出队列
        int path = visitMap[word];            // 获取当前单词的路径长度
        for (int i = 0; i < word.size(); i++) // 遍历当前单词的每个字符
        {
            string newWord = word;       // 创建新单词,用于替换字符,初始化为word本身
            for (int j = 0; j < 26; j++) // 尝试将当前字符替换为26个字母中的每一个 -- 注意i会遍历当前单词的所有字符,所以每个位置的情况都能考虑到(26个字符进行替换当前位置,找到与目标单词相同的情况)
            {
                newWord[i] = j + 'a';  // 替换字符 -- 数字0 - 25转化为字符串a - z
                if (newWord == endStr) // 如果新单词与目标单词相同
                {
                    cout << path + 1 << endl; // 输出路径长度:注意要+1
                    return 0;                 // 结束程序
                }
                if (strSet.find(newWord) != strSet.end() && visitMap.find(newWord) == visitMap.end()) // 如果新单词在集合中且未被访问过 -- BFS优先遍历周围相邻的一圈
                {
                    // 记录新单词的访问信息,并将新单词加入队列
                    visitMap.insert(pair<string, int>(newWord, path + 1));
                    q.push(newWord);
                }
            }
        }
    }
    cout << 0 << endl; // 如果队列为空仍未找到目标单词,则输出0
}

个人感觉代码实现比较复杂,需要理清楚每一步,尤其是两个哈希数组的实现,很容易出错。

题目二:卡码网 105. 有向图的完全可达性

题目链接

105. 有向图的完全可达性 (kamacoder.com)

题目描述

给定一个有向图,包含 N 个节点,节点编号分别为 1,2,...,N。现从 1 号节点开始,如果可以从 1 号节点的边可以到达任何节点,则输出 1,否则输出 -1。

输入描述

第一行包含两个正整数,表示节点数量 N 和边的数量 K。 后续 K 行,每行两个正整数 s 和 t,表示从 s 节点有一条边单向连接到 t 节点。

输出描述

如果可以从 1 号节点的边可以到达任何节点,则输出 1,否则输出 -1。

输入示例

4 4
1 2
2 1
1 3
2 4

输出示例

1

提示信息

从 1 号节点可以到达任意节点,输出 1。

数据范围:

1 <= N <= 100;
1 <= K <= 2000。

题解:DFS

这题相对来说简单一点。

这题使用到了邻接图:用邻接表实现的图。个人感觉还是比较新颖,直接就能表示邻接的节点,就与之前的岛屿问题很像,区别就是:岛屿问题中,各个位置列于矩阵当中,相邻节点就是上下左右四个方向;而对于这种图的问题,相邻节点并非所谓的上下左右,我们需要使用邻接表实现

理清楚这个后,其余思路同之前打卡的岛屿问题一致,这里不做过多解释。

代码如下:

#include <bits/stdc++.h>
using namespace std;

// graph: 邻接表表示的图:节点从1到n
// cur: 当前访问的节点
// visited: 记录节点是否被访问过
// neigbor:记录当前节点cur的相邻节点 -- 当前节点邻接表链接元素
void dfs(const vector<list<int>> &graph, int cur, vector<bool> &visited)
{
    if (visited[cur]) // 如果当前节点已经被访问过,直接返回
        return;
    visited[cur] = true;            // 标记当前节点为已访问
    for (int neighbor : graph[cur]) // 遍历当前节点的邻接节点
    {
        dfs(graph, neighbor, visited); // 递归调用dfs,继续搜索邻接节点
    }
}

int main()
{
    int n, m, s, t;
    cin >> n >> m;                  // 读取节点数n和边数m
    vector<list<int>> graph(n + 1); // 创建一个大小为n+1的邻接表,其中list<int>:它存储了与节点i直接相连的所有其他节点的编号
    while (m--)                     // 读取所有边的信息,并构建图
    {
        cin >> s >> t;         // 读取一条边,s是起点,t是终点
        graph[s].push_back(t); // 在邻接表中添加边s -> t -- 这里需注意:如果是无向图,还需要添加边t -> s,即graph[t].push_back(s); 
    }
    vector<bool> visited(n + 1, false); // 创建一个大小为n+1的访问记录数组,初始都设置为未访问
    dfs(graph, 1, visited);             // 从节点1开始进行dfs
    for (int i = 1; i <= n; i++)        // 检查所有节点是否都被访问过
    {
        if (!visited[i]) // 如果有节点未被访问到
        {
            cout << -1 << endl; // 输出-1表示图不是连通的
            return 0;           // 结束程序
        }
    }
    cout << 1 << endl; // 如果所有节点都被访问到,输出1表示图是连通的
    return 0;          // 结束程序
}

三、小结

今天的打卡到此也就结束了,后边有时间会对图论这一章节进行强化练习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2116689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JDBC:连接数据库

文章目录 报错 报错 Exception in thread “main” java.sql.SQLException: Can not issue SELECT via executeUpdate(). 最后这里输出的还是地址&#xff0c;就是要重写toString()方法&#xff0c;但是我现在还不知道怎么写 修改完的代码&#xff0c;但是数据库显示&#…

WebGL系列教程二(环境搭建及初始化Shader)

目录 1 前言2 新建html页面3 着色器介绍3.1 顶点着色器、片元着色器与光栅化的概念3.2 声明顶点着色器3.3 声明片元着色器 4 坐标系(右手系)介绍5 着色器初始化5.1 给一个画布canvas5.2 获取WebGL对象5.3 创建着色器对象5.4 获取着色器对象的源5.5 绑定着色器的源5.6 编译着色器…

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页&#xff1a;https://tangyuan96.github.io/minigpt_3d_project_page/ 代码&#xff1a;https://github.com/TangYuan96/MiniGPT-3D 论文&#xff1a;https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA&#xff0c;被ACM MM2024接收&#xff0c;只拥…

佰朔资本:9月首选行业为汽车、电子、医药生物等

5—8月商场接连调整&#xff0c;9月开端进入成绩空窗期&#xff0c;流动性和政策改动从头成为商场中心驱动力&#xff0c;风格切换先行&#xff0c;对当时的商场能够豁达一些。价值和生长风格切换的拐点开始闪现&#xff0c;生长相对价值的成绩优势开端走扩&#xff0c;美联储降…

Axure中继器介绍

中继器我们一般在处理重复性比较高的任务时&#xff0c;能让我们达到事半功倍的效果&#xff0c;中继器在整个axure中属于复杂程度比较高的功能&#xff0c;我们今天大致讲一下常用的方法即可。 一、声明一个中继器 默认展示为三行。 点击样式&#xff0c;这里我们可以添加删…

【原创】java+springboot+mysql校园二手商品交易网设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

RestTemplateRibbonOpenFeign

网络模型 OSI七层模型 RestTemplate Ribbon 在微服务中的ribbon 实现负载均衡服务间调用的三种方式 ribbon其他负载均衡策略 OpenFeign 实战

【Shiro】Shiro 的学习教程(五)之 SpringBoot 集成 Shiro + JWT

与 Spring 集成&#xff1a;与 Spring 集成 与 SpringBoot 集成&#xff1a;与 SpringBoot 集成 1、SpringBoot Shiro Jwt ①&#xff1a;引入 pom.xml&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-…

使用kubeadm手动安装K8s

本次教程安装主要基于Ubuntu 22.04&#xff0c; 使用AWS EC2服务器来部署。当然&#xff0c;AWS也有自己的AWS K8s服务&#xff0c;不过需要花费小钱钱。虽然也不是说不行&#xff0c;但手动安装下也能熟悉K8s。 1. 安装Docker 卸载旧版本&#xff1a; sudo apt-get re…

数据结构与算法 第12天(排序)

一、排序方法分类 按照数据存储介质&#xff1a; 内部排序&#xff1a;数据量不大、数据在内存&#xff0c;无需内外存交换数据 外部排序&#xff1a;数据量较大、数据在外存(文件排序) 将数据分批调入内存排序&#xff0c;结果放到外存 按照比较器个数&#xff1a; 串行…

微带结环行器仿真分析+HFSS工程文件

微带结环行器仿真分析HFSS工程文件 工程下载&#xff1a;微带结环行器仿真分析HFSS工程文件 我使用HFSS版本的是HFSS 2024 R2 参考书籍《微波铁氧体器件HFSS设计原理》和视频微带结环行器HFSS仿真 1、环形器简介 环行器是一个有单向传输特性的三端口器件&#xff0c;它表明…

大数据之Flink(六)

17、Flink CEP 17.1、概念 17.1.1、CEP CEP是“复杂事件处理&#xff08;Complex Event Processing&#xff09;”的缩写&#xff1b;而 Flink CEP&#xff0c;就是 Flink 实现的一个用于复杂事件处理的库&#xff08;library&#xff09;。 总结起来&#xff0c;复杂事件处…

IM项目运行说明

注册登录以及消息列表界面&#xff1a; 联系人界面&#xff1a;新的好友/群聊列表/好友列表 界面&#xff1a; 群聊界面&#xff1a;群聊不想支持发视频&#xff0c;因为非技术上的麻烦原因。。。 图片可以下载&#xff1a; 私聊可以发视频&#xff1a; 私聊支持服务器消…

android kotlin 数据类 data class

1、Kotlin中的数据类主要用于保存数据。对于每个数据类&#xff0c;编译器会自动生成其他成员函数&#xff0c;允许您将实例打印到可读输出、比较实例、复制实例等。 中文文档&#xff1a; https://book.kotlincn.net/text/data-classes.html 2、新建文件dataClassTest.kt 3…

vue解决“用户代理样式表“边距问题

一、问题 当我们制作页面的时候&#xff0c;会发现页面会多出边距 打开控制台发现&#xff0c;是使用了“用户代理样式表” 这个无法去除&#xff0c;但是又觉得页面有间隙不好看&#xff0c;那怎么去除间隙&#xff1f;&#xff1f; 二、解决 将要写的东西放在div里&#x…

大模型笔记02--基于fastgpt和oneapi构建大模型应用平台

大模型笔记02--基于fastgpt和oneapi构建大模型应用平台 介绍部署&测试部署fastgptoneapi服务部署向量模型m3e和nomic-embed-text测试大模型 注意事项说明 介绍 随着大模型的快速发展&#xff0c;众多IT科技厂商都开发训练了各自的大模型&#xff0c;并提供了各具特色的AI产…

专题二_滑动窗口_算法专题详细总结

目录 滑动窗口&#xff0c;引入&#xff1a; 滑动窗口&#xff0c;本质&#xff1a;就是同向双指针&#xff1b; 1.⻓度最⼩的⼦数组&#xff08;medium&#xff09; 1.解析&#xff1a;给我们一个数组nums&#xff0c;要我们找出最小子数组的和target&#xff0c;首先想到的…

arduino ide安装详细步骤

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Arduino IDE 是一个专为编程 Arduino 微控制器设计的集成开发环境&#xff0c;使用起来非常方便。下面将介绍如何在不同平台上安装 Arduino IDE 的详细步骤&#xff0c;包括 Windows、Mac 和 Linux 系统。 …

计算机毕业设计选题推荐-乐器推荐系统-乐器商城-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 11部署BGP

本章应有助于回答以下问题: 核心的配置概念是什么?如何为 Clos 网络配置 BGP ?无编号的 BGP 如何工作?如何配置 BGP 与主机上的 BGP 发言者 (例如 Kube-router) 建立对等关系?如何配置 BGP 以对网络进行计划维护? 核心的 BGP 配置概念 全局BGP 配置&#xff0c;包含: r…