Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode 1548. The Most Similar Path in a Graph(动态规划)

LeetCode 1548. The Most Similar Path in a Graph(动态规划)

作者头像
Michael阿明
发布于 2021-02-19 03:13:08
发布于 2021-02-19 03:13:08
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

文章目录

1. 题目

We have n cities and m bi-directional roads where roads[i] = [ai, bi] connects city ai with city bi. Each city has a name consisting of exactly 3 upper-case English letters given in the string array names. Starting at any city x, you can reach any city y where y != x (i.e. the cities and the roads are forming an undirected connected graph).

You will be given a string array targetPath. You should find a path in the graph of the same length and with the minimum edit distance to targetPath.

You need to return the order of the nodes in the path with the minimum edit distance, The path should be of the same length of targetPath and should be valid (i.e. there should be a direct road between ans[i] and ans[i + 1]). If there are multiple answers return any one of them.

The edit distance is defined as follows:

Follow-up: If each node can be visited only once in the path, What should you change in your solution?

Example 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Input: n = 5, 
roads = [[0,2],[0,3],[1,2],[1,3],[1,4],[2,4]], 
names = ["ATL","PEK","LAX","DXB","HND"], 
targetPath = ["ATL","DXB","HND","LAX"]
Output: [0,2,4,2]
Explanation: [0,2,4,2], [0,3,0,2] and [0,3,1,2] are accepted answers.
[0,2,4,2] is equivalent to ["ATL","LAX","HND","LAX"] which has edit distance = 1 with targetPath.
[0,3,0,2] is equivalent to ["ATL","DXB","ATL","LAX"] which has edit distance = 1 with targetPath.
[0,3,1,2] is equivalent to ["ATL","DXB","PEK","LAX"] which has edit distance = 1 with targetPath.

Example 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Input: n = 4, 
roads = [[1,0],[2,0],[3,0],[2,1],[3,1],[3,2]], 
names = ["ATL","PEK","LAX","DXB"], 
targetPath = ["ABC","DEF","GHI","JKL","MNO","PQR","STU","VWX"]
Output: [0,1,0,1,0,1,0,1]
Explanation: Any path in this graph has edit distance = 8 with targetPath.

Example 3:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Input: n = 6, 
roads = [[0,1],[1,2],[2,3],[3,4],[4,5]], 
names = ["ATL","PEK","LAX","ATL","DXB","HND"], 
targetPath = ["ATL","DXB","HND","DXB","ATL","LAX","PEK"]
Output: [3,4,5,4,3,2,1]
Explanation: [3,4,5,4,3,2,1] is the only path with edit distance = 0 with targetPath.
It's equivalent to ["ATL","DXB","HND","DXB","ATL","LAX","PEK"]
 
Constraints:
2 <= n <= 100
m == roads.length
n - 1 <= m <= (n * (n - 1) / 2)
0 <= ai, bi <= n - 1
ai != bi 
The graph is guaranteed to be connected and each pair of nodes may have at most one direct road.
names.length == n
names[i].length == 3
names[i] consists of upper-case English letters.
1 <= targetPath.length <= 100
targetPath[i].length == 3
targetPath[i] consists of upper-case English letters.

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/the-most-similar-path-in-a-graph 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    vector<int> mostSimilar(int n, vector<vector<int>>& roads, vector<string>& names, vector<string>& targetPath) {
        vector<vector<int>> g(n);
        for(auto& r : roads)
        {
            g[r[0]].push_back(r[1]);
            g[r[1]].push_back(r[0]);
        }//建图
        int len = targetPath.size();
        vector<vector<int>> dp(len, vector<int>(n, INT_MAX));
        //走完 ?target后的 在城市 ni 的最小编辑距离
        vector<vector<int>> path1(n);//n个城市作为结束的最佳路线
        vector<vector<int>> path2(n);//存储下一个状态的路径
        for(int i = 0; i < n; ++i)//初始化
        {
            dp[0][i] = (names[i] != targetPath[0]);
            path1[i].push_back(i);
        }
        int mindis = INT_MAX, minidx = -1;
        for(int k = 1;  k < len; ++k)
        {	//样本维度
            for(int i = 0; i < n; ++i)
            {	//前一个城市
                if(dp[k-1][i] == INT_MAX)
                    continue;
                for(int j : g[i])
                {	//下一个相连的城市
                    if(dp[k][j] > dp[k-1][i]+(names[j]!=targetPath[k]))
                    {
                        dp[k][j] = dp[k-1][i]+(names[j]!=targetPath[k]);
                        path2[j] = path1[i];
                        path2[j].push_back(j);
                    }
                }
            }
            swap(path1, path2);//滚动数组,更新当前的最佳路径至path1
        }
        for(int i = 0; i < n; i++) 
        {
            if(mindis > dp[len-1][i])
            {
                mindis = dp[len-1][i];
                minidx = i;
            }
        }//取编辑距离最小的城市编号
        return path1[minidx];//返回路径
    }
};

1260 ms 109.6 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于gitlab gitlab-runner的cicd部署
在本文中,我将介绍如何基于 GitLab 和 GitLab Runner 进行 CI/CD 部署。GitLab 是一个强大的 Git 仓库管理系统,提供了完整的 CI/CD 管理功能。GitLab Runner 是一个用于运行 CI/CD 作业的轻量级容器化工具。我们将使用 Docker 容器来运行 GitLab 和 GitLab Runner。
堕落飞鸟
2023/03/27
1.7K0
依托于GitLab持续集成基础配置和使用
[TOC] 0x00 前言简述 Q:我们常说的CI/CD是什么? CI 为 Continuous Integration 的缩写持续集成,可以理解为代码变动提交后,自动执行代码编译、代码打包、代码测试
全栈工程师修炼指南
2020/10/23
2.3K0
依托于GitLab持续集成基础配置和使用
使用 GitLab Runner
理解了上面的基本概念之后,有没有觉得少了些什么东西 —— 由谁来执行这些构建任务呢? 答案就是 GitLab Runner 了!
用户8851537
2021/08/04
3K0
GitLab Runner介绍及安装
GitLab Runner是一个开源项目,用于运行您的作业并将结果发送回GitLab。它与GitLab CI一起使用,GitLab CI是GitLab随附的开源持续集成服务,用于协调作业。
没有故事的陈师傅
2021/03/19
7.4K0
通过 Gitlab CI 完成前端自动化构建
​ GitLab-Runner 是配合 GitLab-CI 进行使用的。一般地,GitLab里面的每一个工程都会定义一个属于这个工程的软件集成脚本,用来自动化地完成一些软件集成工作。当这个工程的仓库代码发生变动时,比如有人 push 了代码,GitLab 就会将这个变动通知 GitLab-CI。这时 GitLab-CI 会找出与这个工程相关联的Runner,并通知这些Runner把代码更新到本地并执行预定义好的执行脚本。
奋飛
2021/08/30
1.3K0
通过 Gitlab CI 完成前端自动化构建
1.基于GitLab代码仓库的持续集成基础配置和使用
[TOC] 0x00 前言简述 CI/CD介绍 Q:我们常说的CI/CD是什么? CI 为 Continuous Integration 的缩写持续集成,可以理解为代码变动提交后,自动执行代码编译、代
全栈工程师修炼指南
2022/09/29
4K0
1.基于GitLab代码仓库的持续集成基础配置和使用
gitlab ci/cd 多项目流水线制品合并方案
首先需要在linux上安装 gitlab-runner 然后注册一个shell作为执行器的runner 该runner将应用于需要构建的项目
拿我格子衫来
2022/01/24
9670
gitlab ci/cd 多项目流水线制品合并方案
Docker安装Gitlab和Gitlab-Runner并实现项目的CICD
介绍如何在Linux系统使用Docker安装Gitlab、Gitlab-Runner并实现项目的CICD
薛定喵君
2019/11/05
3K0
Gitlab CI 搭建持续集成环境
在软件工程里,持续集成(Continuous Integration, CI)是指这样的一种实践:在一天里多次将所有开发人员的代码合并到一个共享的主干里,每次合并都会触发持续集成服务器进行自动构建,这个过程包括了编译、单元测试、集成测试、质量分析等步骤,结果只有两个:成功或者失败。如果得到失败的结果,说明有人提交了不合格的代码,这就能及时发现问题。
YP小站
2020/06/04
2.9K0
Gitlab CI 搭建持续集成环境
GitLab平台太单调? 配置Pipeline流水线,装上这个流水线“瀑布灯”!
在上一篇文章中,我们介绍了如何使用Docker搭建自己的GitLab代码托管平台。
Mintimate
2023/10/01
3.5K0
GitLab平台太单调? 配置Pipeline流水线,装上这个流水线“瀑布灯”!
Kubernetes 集群中运行 GitLab-Runner 来执行 GitLab-CI
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aixiaoyang168/article/details/81149264
哎_小羊
2019/05/25
3.4K0
打造企业级自动化运维平台系列(十):Gitlab Runner 实现 CI/CD 详解
Gitlab实现CICD的方式有很多,比如通过Jenkins,通过Gitlab Runner等,今天主要介绍后者。Gitlab在安装的时候,就默认包含了Gitlab CI的能力,但是该能力只是用于协调作业,并不能真的去执行作业,因此需要搭配Gitlab Runner来作为执行器实现具体的CICD工作。Gitlab Runner可以被安装在任意支持的系统上,比如Linux、Windows、Mac,甚至也可以运行在Docker、Kubernetes集群上。更多关于构建企业自动化运维平台系列的
民工哥
2024/01/18
8400
打造企业级自动化运维平台系列(十):Gitlab Runner 实现 CI/CD 详解
从入门到精通:.gitlab-ci.yml文件的完整指南
在现代软件开发中,持续集成和持续部署已经成为项目成功的关键因素之一。而.gitlab-ci.yml文件,则是这一过程中不可或缺的一部分,它像是一个魔法书,为你的代码赋予了生命力。今天,就让我们一起来揭开.gitlab-ci.yml文件的神秘面纱,探索其中的奇妙世界吧!
一只牛博
2025/05/30
6310
从入门到精通:.gitlab-ci.yml文件的完整指南
Docker搭建自己的Gitlab CI Runner
哎_小羊
2018/01/02
15.3K0
Docker搭建自己的Gitlab CI Runner
gitlab-CI 持续集成以及runner的配置简版
在我们完成项目开发后,提交到git,当监听提交后,自动进行编译,并进行项目的部署,是不是一想就很爽,所以下面引入我们的主角 —— gitlab-CI,中文文档 。
神葳
2021/01/22
2.4K0
gitlab-CI 持续集成以及runner的配置简版
I-team博客的gitlab-runner持续集成实践
做为一个略微看过nodejs语法,但又不懂nodejs的攻城狮,搭建hexo环境很是麻烦,要考虑到翻墙、版本兼容等问题。于是乎,博主每换一个电脑,为了能继续发博客,都需要在新电脑上花一天时间重新搞一下 hexo 环境,楼主感觉还是有简洁的方案来实现我一提交代码就可以自动发布博客,不需要再手动操作一波,这样岂不美哉。so,也就有了今天的经历,代码可以持续集成,博客也可以。楼主的解决方案是使用gitlab与gitlab-runner实现博客部署的持续集成,效果真的不要太好。
haifeiWu
2018/09/11
1.2K0
I-team博客的gitlab-runner持续集成实践
图文详解k8s自动化持续集成之GitLab CI/CD
  如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
sunsky
2020/08/20
5.1K0
图文详解k8s自动化持续集成之GitLab CI/CD
Ubuntu上如何使用GitLab CI搭建持续集成Pipeline
GitLab Community Edition是一个自托管的Git存储库提供程序,具有帮助项目管理和软件开发的附加功能。GitLab提供的最有价值的功能之一是内置的持续集成和交付工具GitLab CI。
爆栈工程师
2018/08/13
4.4K0
Ubuntu上如何使用GitLab CI搭建持续集成Pipeline
Ubuntu18注册gitlab-runner并激活CI/CD
打开 gitlab 项目 -> 设置 -> CI / CD -> Runners 设置,获取令牌
用户8851537
2021/08/04
1.2K0
【GitLab CI/CD 实践】从 0 到 1 搭建高效自动化部署流程
GitLab CI/CD 是 GitLab 内置的持续集成和持续部署(CI/CD)工具,它可以帮助开发团队自动化代码测试、构建和部署。本指南将介绍如何使用 GitLab CI/CD 搭建完整的自动化部署流程,包括 .gitlab-ci.yml 配置文件的编写、Stages、Jobs、Artifacts 以及 Runner 的使用。
Swift社区
2025/02/07
1.2K0
【GitLab CI/CD 实践】从 0 到 1 搭建高效自动化部署流程
推荐阅读
相关推荐
基于gitlab gitlab-runner的cicd部署
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验