前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 1548. The Most Similar Path in a Graph(动态规划)

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

作者头像
Michael阿明
发布2021-02-19 11:13:08
1.2K0
发布2021-02-19 11:13:08
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

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
复制
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
复制
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
复制
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
复制
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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档