欧拉回路(leetcode 重新安排行程)

2024-05-03 00:20

本文主要是介绍欧拉回路(leetcode 重新安排行程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先学习一下欧拉回路是怎么一回事。

对于图中这七个节点,从节点1出发,最终要到达节点1,并且每条路只能走一次,且每条路都得走过一次。

使用dfs,如果算法按照字典序的排列方式选择下一个节点。

第一部分:那么算法的流程是,节点1--> 节点2-->节点3-->节点1。这时候到达节点1后发现,节点1无路可走了兄弟们,退回到节点3继续走呗。

第二部分:接着流程是,节点3--> 节点4-->节点5-->节点3。退退退,退到节点5发现也无路可走,再退到节点4继续。

第三部分:接着流程是,节点4--> 节点6-->节点7-->节点4。最终所有的路都走了一遍。

我们发现,第二部分的流程,从3开始,最终到达3,那么可以插入到第一部分的节点3上。

第一部分的流程变成:节点1--> 节点2-->节点3--> 节点4-->节点5-->节点3-->节点1。

第三部分流程,从4开始,最终到达4,那么可以插入到第一部分的节点4上。

第一部分的流程变成:节点1--> 节点2-->节点3--> 节点4--> 节点6-->节点7-->节点4-->节点5-->节点3-->节点1。

这一套流程下来,所有的边都走过一遍,且只走一遍。

再重新分析一遍第一部分,节点1--> 节点2-->节点3-->节点1,发现最终到达节点1的时候,无路可走,节点3又可以走其他路,那么可以推出,从节点3-->节点1这一段路应该是最后的一段路。可以先加入列表ans中。

第二部分流程是,节点3--> 节点4-->节点5-->节点3。发现最终到达节点3的时候,无路可走,节点4又可以走其他路,那么可以推出,从节点4-->节点5-->节点3。这一段路应该是倒数第二段路。可以加入列表ans中。

第三部分流程是,节点4--> 节点6-->节点7-->节点4。最终所有的路都走了一遍。这是从节点4到达节点4的一段路,是正着走的一段路,ans中倒着走的一段路。

看例题:

这是有向图,并且路径可能重复。例如可能存在两条一样的路:JFK-->SFO。

class Solution:def findItinerary(self, tickets: List[List[str]]) -> List[str]:edge = defaultdict(list)ans = []for x, y in tickets:edge[x].append(y)def dfs(u):qu = edge[u]qu.sort()while qu:v = qu.pop(0)dfs(v)ans.append(u)dfs('JFK')return ans[::-1]

这篇关于欧拉回路(leetcode 重新安排行程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/955451

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划