如何求解欧拉路径?

news2024/11/25 6:50:41

求解欧拉路径

  • 前言
  • 一、案例
  • 二、回溯
  • 三、源码
  • 四、复杂度分析
  • 五、欧拉科普
  • 总结
  • 参考文献

前言

欧拉路径 == 从图的一个节点出发,每条边只访问一次,遍历完了所有图节点,这条路径为欧拉路径。

一、案例

在这里插入图片描述

二、回溯

按照上面的例子,很容易理解欧拉路径。
但是有一个很关键的点就是,可能多条路径,走到了那条死胡同路径,就是提前到达了终点,示例如下,
在这里插入图片描述
JFK -> AAA,就先走到了死胡同!!!关键点就在于解决死胡同问题

一条欧拉路径,易知死胡同就是终点,那么遇到死胡同将其压栈到栈底作为终点,删除该死胡同节点,继续DFS遇到下一个死胡同就是倒数第二个节点,依次类推,一个个死胡同就压入栈中,而出栈顺序就是欧拉路径。

三、源码

class Solution {
    // 欧拉path问题。
    // 一定存在一条合理欧拉path,那么遇到一个死胡同就是末尾节点,删点这个死胡同,再遇到的死胡同就是倒数第二个节点,依次类推。
    // 需要最小字典序欧拉path,所以边需要末节点的字典序排序,采用优先队列。
    final static String next = "JFK";
    public List<String> findItinerary(List<List<String>> tickets) {
        // 建图
        buildGraph(tickets);
        // 以JFK为起点DFS
        dfs(next);
        // 出栈得到欧拉path,并返回。
        return getPath();
    }
    public List<String> getPath(){
        List<String> rs = new ArrayList<>();
        while(!postions.isEmpty()){
            rs.add(postions.pop());
        }
        return rs;
    }
    // DFS
    Stack<String> postions = new Stack<>();
    public void dfs(String pos){
        PriorityQueue<String> pq = graph.get(pos);
        while(!pq.isEmpty()){
            String next = pq.poll();
            dfs(next);
        }
        postions.push(pos);
    }
    // 建图
    Map<String,PriorityQueue<String>> graph = new HashMap<>();
    public void buildGraph(List<List<String>> tickets){
        for(List<String> ticket : tickets){
            addEdge(ticket);
        }
    }
    public void addEdge(List<String> ticket){
        String from = ticket.get(0),to = ticket.get(1);
        addNode(from);
        addNode(to);

        graph.get(from).offer(to);
    }
    public void addNode(String pos){
        if(!graph.containsKey(pos)){
            graph.put(pos,new PriorityQueue<>());
        }
    }
}

四、复杂度分析

1.时间复杂度
访问每个节点和边:O(|V| + |E|);优先队列排序:O(|E|log|E|);
2.空间复杂度
链式欧拉路径,栈最深:O(|E|);欧拉路径栈深:O(|V|)

五、欧拉科普

通过图中所有边恰好一次且行遍所有顶点的通路称为欧拉通路;
通过图中所有边恰好一次且行遍所有顶点的回路称为欧拉回路;
具有欧拉回路的无向图称为欧拉图;
具有欧拉通路但不具有欧拉回路的无向图称为半欧拉图。

总结

1)对于欧拉路径问题,有直接的死胡同解决办法,自己想确实不好想到,所以要先积累,再创新。
2)欧拉路径的解决,是以死胡同为关键问题点,引出死胡同就是终点的认知,再到回溯得到死胡同。可以抽象为寻找关键问题点,针对关键点进行解决或者问题转换,最终得解。

参考文献

[1] LeetCode 重新安排行程
[2] LeetCode 官方题解

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

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

相关文章

【LeetCode】1945. 字符串转化后的各位数字之和

题目描述 给你一个由小写字母组成的字符串 s &#xff0c;以及一个整数 k 。 首先&#xff0c;用字母在字母表中的位置替换该字母&#xff0c;将 s 转化 为一个整数&#xff08;也就是&#xff0c;‘a’ 用 1 替换&#xff0c;‘b’ 用 2 替换&#xff0c;… ‘z’ 用 26 替换&…

计算机网络原理第1章 概述

1.1 计算机网络在信息时代中的作用 1.2 互联网概述 1.2.1 网络的网络 互联网 特指Internet&#xff0c;起源于美国&#xff0c;现已发展成为世界上最大的、覆盖全球的计算机网络。 计算机网络 (简称为网络) 由若干结点(node)和连接这些结点的链路(link)组…

玩转MySQL:一站式解决分库分表后患问题方案

引言 上篇有关分分库分表一文中已经将分库分表的方法论全面阐述清楚了&#xff0c;总体看下来用一个字形容&#xff0c;那就是爽&#xff01;&#xff08;手动狗头&#xff09;尤其是分库分表技术能够让数据存储层真正成为三高架构&#xff0c;但前面爽是爽了&#xff0c;接着…

面试官:你觉得HTTPS能防止重放攻击吗?

引言 先来一段面试情景再现~~ ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 最后的结局自然就是 ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; OK&#xff0c;带着上面的疑问&#xf…

【SpringCloud负载均衡】【源码+图解】【四】负载均衡的实现

【SpringCloud负载均衡】【源码图解】【三】LoadBalancer的工作原理 目录4. 负载均衡4.1 提供者DiscoveryClient4.1.1 CompositeDiscoveryClient4.1.2 EurekaDiscoveryClient4.1.3 SimpleDiscoveryClient4.1.4 自定义DiscoveryClient4.2 过滤器Supplier4.2.1 CachingServiceIns…

Linux文本三剑客之grep命令

Linux文本三剑客之grep命令 1. grep 命令 介绍 grep 命令的基本语法格式和参数列表&#xff01; 文本搜索工具&#xff0c;根据用户指定的”模式”对目标文本逐行进行匹配检查&#xff0c;打印匹配到的行。 模式&#xff1a;由正则表达式字符及文本字符所编写的过滤条件&am…

MySQL 中截取字符串的方法

LEFT(str, len) 从左边开始截取&#xff0c;如果字符串为 null 则返回null。 str&#xff1a;被截取字符串&#xff1b;len&#xff1a;截取长度 SELECT LEFT(ABCDEFT, 2) FROM sub_str;RIGHT(str, len) 从右边开始截取&#xff0c;如果字符串为 null 则返回null。 str&…

0125 搜索与回溯算法 Day14

剑指 Offer 12. 矩阵中的路径 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻…

GLAD:带有反射壁的空心波导

概述 离散傅里叶变换的混叠效应为带有反射壁的空心波导的建模提供了一个便捷的方法。反射壁可以将光返回到光路中而混叠效应将使溢出光场从反方向折回到采样光场中。如果光场分布是一个偶函数&#xff0c;那么折回的作用就如同反射效果。我们可以将任意形状的光场分布转化成…

推荐一款免费的AI绘图软件,可生成二次元画作和3D模型

随着AI绘画的火热&#xff0c;市面上关于AI绘画的话题居高不小&#xff0c;各种教程、软件、小程序也是满天飞&#xff0c;在这些眼花缭乱的推荐中&#xff0c;究竟哪一款ai绘图软件才是真正适合自己的&#xff0c;不但免费&#xff0c;生成出来的二次元画作还很精美&#xff1…

早教资源网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 网站前台&#xff1a;关于我们、联系我们、公告信息、二手物品、资源信息 管理员功能&#xff1a; 1、管理关于我们、联…

Django 第三天学习笔记

1.模板层-变量和标签 能够传递到Django模板中的数据类型&#xff1a; 1.str 字符串 2.Int 整形 3.List 数组 4.Tuple 元组 5.Dict 字典 6.Func 方法 7.Obj 类的实例化对象。 在模板中使用的变量的语法&#xff1a; {{变量名}}{{变量名.index}} #索引{{变量名.key}} #获取字典对…

数据结构顺序栈

栈 这是大话数据结构种对于栈的描述 可以看到 栈是一种特殊的线性表 它只能在尾部进行元素的插入和删除 但是在栈种 这叫做 入栈 和 出栈 而且它遵循 先进入的元素后出 后进入的元素先出 即就是我们常听说的 先进后出 和后进先出 这里就有一个简单的例子 先进后出 后进先出…

【Node.js】实现微信小程序在线支付功能

实战项目名称&#xff1a;微信小程序实现在线支付功能 - 文章结尾附上微信小程序码&#xff0c;扫码登录后即可体验&#xff01;&#xff01; 文章目录一、实战步骤1. 前期准备2. 添加wechatpay-node-v3和fs插件3. 预设微信下单的数据4. 将上一步骤的下单信息返回给前端5. 小程…

在抖音全程看世界杯,超高清直播背后的硬实力

导语&#xff1a;IT技术赛场开赛&#xff01;作者 | 宋慧 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;当前&#xff0c;2022 卡塔尔世界杯比赛正在如火如荼进行中&#xff0c;处在更加激烈关键的半决赛阶段。作为足球运动的全球顶级赛事&#xff0c;世界杯…

SysML图例-核聚变

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> [新闻]核聚变里程碑式突破>> SysML图中词汇&#xff1a; Tokamak&#xff1a; 一种利用磁约束来实现受控核聚变的环形容器&#xff0c;通过约束电磁波驱动&#xff…

如何形成前端知识体系

来啦各位大佬&#xff5e;但很不好意思&#xff0c;我就是标题党&#xff0c;这篇博文并没有很明确的给出「如何形成前端知识体系」答案&#xff0c;我自学前端&#xff0c;在面试字节的时候&#xff0c;字节的大佬说我的知识点没有成体系&#xff0c;很零散的飘在各个地方&…

面试官:你如何实现大文件上传

提到大文件上传&#xff0c;在脑海里最先想到的应该就是将图片保存在自己的服务器&#xff08;如七牛云服务器&#xff09;&#xff0c;保存在数据库&#xff0c;不仅可以当做地址使用&#xff0c;还可以当做资源使用&#xff1b;或者将图片转换成base64&#xff0c;转换成buff…

怎么复制网页上不能复制的文字(付费文档免费复制),一招搞定

好多小伙伴上网查资料的时候&#xff0c;想要复制网页内容&#xff0c;但是提示付费复制或者不允许复制&#xff0c;遇到这种情况怎么办呢&#xff1f;下面就是小编分享的一招搞定无法复制网页内容文字的方法。 怎么复制网页上不能复制的文字 借助360安全浏览器/360极速浏览器…

Minecraft 1.19.2 Forge模组开发 06.建筑生成

1.12.2自定义建筑生成 1.16.5自定义建筑生成 1.18.2自定义建筑生成 我们本次尝试在主世界生成一个自定义的建筑。 效果展示效果展示效果展示 由于版本更新缘故&#xff0c;1.19的建筑生成将不涉及任何Java包的代码编写&#xff0c;只需要在数据包中对建筑生成进行自定义。 …