IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 建信金融科技力扣专场竞赛C——链式前向星+dfs路径输出 -> 正文阅读

[数据结构与算法]建信金融科技力扣专场竞赛C——链式前向星+dfs路径输出

建信03. 地铁路线规划

题目

某城市有若干条地铁线路,lines 记录了每条地铁线路依次停靠的站点(每条线路均是双向的)
李林想从站点 start 出发前往 end,请规划一条可行路线使得他可以以最小的换乘次数到达目的站点。若有多条路线满足要求,请返回字典序最小的路线(要求路线上无重复的站点)。

注意:

输入数据保证存在 start 到 end 的路线
任意路线上的点在该条路线上仅出现一次(即任意一条路线均不是环线)
示例 1:

输入:lines = [[1,2,3,4,5],[2,10,14,15,16],[10,8,12,13],[7,8,4,9,11]], start = 1, end = 7

输出:[1,2,3,4,8,7]

解释:路线如图所示
从站点 1 到站点 7 的最少换乘 1 次,路线为 [1,2,3,4,8,7]
image.png

示例 2:

输入:lines = [[1,2,3,4,5,6,7,8,9,10,11],[12,13,2,14,8,15],[16,1,17,10,18]], start = 9, end = 1

输出:[9,8,7,6,5,4,3,2,1]

解释:路线如图所示
从站点 9 到站点 1 的最少换乘 0 次,路线为 [9,8,7,6,5,4,3,2,1]
image.png

提示:

1 <= lines.length, lines[i].length <= 100
1 <= lines[i][j], start, end <= 10000

思路:
采用链式前向星建图,深度优先搜索最少换乘,可以采用vector记录路径。时间复杂度有点高,期待大佬们给点意见。代码如下:

class Solution {
public:
    const static int N = 10005;
    int minx = 0x3f3f3f3f;
    
    struct node{
        int to;
        int next;
        int kind;	//表示地铁线
    }edge[N];
    
    vector<int> path,target;
    
    int head[N],book[N] = {0},kind = 0,cnt = 0,endd = 0;
    
    void add_edge(int u,int v,int kind){
        edge[cnt].to = v;
        edge[cnt].next = head[u];
        edge[cnt].kind = kind;
        head[u] = cnt++;
    }
    
    void dfs(int start,int kind,int kinds){
     
        if(kinds > minx){
            return ;   //减枝
        }
        
        if(start == endd){
            if(minx > kinds){
                 target.assign(path.begin(),path.end());
                 minx = kinds;
                 return;
            }
            for(int i = 0; i < path.size() && i < target.size(); ++i){
                if(target[i] < path[i]) return;  //还是原来的字典序小
                if(target[i] > path[i]) break;
            }
            target.assign(path.begin(),path.end());
            minx = kinds;
            return;
        } else {
                 for(int i = head[start]; i != -1; i = edge[i].next){
                if(!book[edge[i].to]){
                    book[edge[i].to] = 1;
                    path.push_back(edge[i].to);
                    if(edge[i].kind != kind && kind != 0){   //种类不一样加1
                        dfs(edge[i].to,edge[i].kind,kinds + 1);
                    }else{  //种类一样不变
                        dfs(edge[i].to,edge[i].kind,kinds);
                    }
                    book[edge[i].to] = 0;   //回溯
                    path.pop_back();
                }
            }
        }    
    }
    
    vector<int> metroRouteDesignI(vector<vector<int>>& lines, int start, int end) {
        endd = end;
        memset(head,-1,sizeof(head));
        for(const auto& row : lines){
            ++kind;
            for(int i = 1; i < row.size(); ++i){
                add_edge(row[i - 1],row[i],kind);
                add_edge(row[i],row[i - 1],kind);
            }
        }
        book[start] = 1;
        path.push_back(start);
        dfs(start,0,0); 
        return target;
    }
};

没接触力扣之前都不知道c++也有public,private这些,学的太浅了哎。
这题刚好复习了链式前向星,之前对链式前向星都只停留在会用的阶段,这次算是理解了。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-19 17:52:03  更:2021-11-19 17:54:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:50:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码