首页 > 编程语言 >【回溯算法】

【回溯算法】

时间:2023-05-09 19:13:07浏览次数:33  
标签:tickets destination 算法 dict 回溯 path trips

目录

回溯算法

力扣上典型的回溯算法相关题目如下:

序号 题目
1 332. 重新安排行程

应用

应用1:Leetcode.332

题目

332. 重新安排行程

分析

假设有 \(n\) 张机票,那么,就可以经过 \(n + 1\) 个机场,因此,回溯过程的终止条件,即路径上的点的个数比机票数多 \(1\) 个

我们定义个递归函数:

def dfs(self, ticket_num: int, trips: dict[dict[int]], path: List[str]) -> bool:

利用后序遍历的思路,去判断从当前起点开始,能否经过所有的机场。

算法步骤:

  • 先对所有的机票按照字典序排序;

  • 用 \(hash\) 表 \(trips\) 记录每一对起点到终点的数量;

  • 从起点开始,按照字典序回溯每一个目的机场最终能否经过所有的机场;

    • 如果能到达所有的机场,则该路径满足条件;

    • 如果不能到达所有的机场,则继续回溯。

代码实现

class Solution:
    def findItinerary(self, tickets: List[List[str]]) -> List[str]:
        trips = defaultdict(dict)

        # 先对tickets按照字典序排序,因为python中的dict是有序字典
        tickets.sort(key = lambda x: (x[0], x[1]))
        for _from, _to in tickets: 
            if _from not in trips:
                trips[_from] = defaultdict(int)
            trips[_from][_to] += 1

        path = ["JFK"]
        self.dfs(len(tickets), trips, path)
        return path

    def dfs(self, ticket_num: int, trips: dict[dict[int]], path: List[str]) -> bool:
        if len(path) == ticket_num + 1:
            return True

        start = path[-1]
        # 优先遍历字典序靠前的目的机场,如果满足条件则加入路径中
        for destination, count in trips[start].items():
            if trips[start][destination] < 1:
                continue

            path.append(destination)
            trips[start][destination] -= 1
            if self.dfs(ticket_num, trips, path):
                return True
            path.pop()
            trips[start][destination] += 1

        return False

参考:

标签:tickets,destination,算法,dict,回溯,path,trips
From: https://www.cnblogs.com/larry1024/p/17385980.html

相关文章

  • 常见算法和数据结构存在的坑(updating)
    数组:c++数组下标都+5会稳。\(5000*5000\)的别开\(6000*6000\)。二分:实数二分可能因为神马精度问题出现了不满足二分序的情况,要小心。注意二分完后,不能直接用当前数组里存的值,要pd(ans),值才是正确的。边集数组:无向图边的范围要开2倍。多组数据要清空的有tot,final当用到反向边的时候......
  • AI智慧安监:打电话/玩手机智能检测算法的场景应用
    1、方案背景 在油库、加油站、化工厂等场景中,安全生产是首要的监管问题,因为有易燃物品的存放,打电话很容易引起火灾爆炸等安全事故,造成巨大的生命和财产损失。因此,对人员行为的监管是安全的关键,在一些特定场合需要禁止人员打电话。传统的监管方式容易造成疏漏,利用AI智能识别技术......
  • 【视频】时间序列分类方法:动态时间规整算法DTW和R语言实现|附代码数据
    原文链接:http://tecdat.cn/?p=22945最近我们被客户要求撰写关于动态时间规整算法的研究报告,包括一些图形和统计输出动态时间扭曲算法何时、如何以及为什么可以有力地取代常见的欧几里得距离,以更好地对时间序列数据进行分类时间序列分类的动态时间扭曲使用机器学习算法对时间序......
  • 学习JavaScript数据结构与算法 第五章
    五,队列和双端队列我们已经学习了栈。队列和栈非常类似,但是使用了与后进先出不同的原则。双端队列是一种将栈的原则和队列的原则混合在一起的数据结构。5.1队列数据结构队列是遵循先进先出(FIFO,也称为先来先服务)原则的一组有序的项。队列在尾部添加新元素,并从顶部移除元素。最......
  • 排序算法
    1.插入排序voidinsert_sort(){for(inti=1;i<n;i++){intx=a[i];intj=i-1;while(j>=0&&x<a[j]){a[j+1]=a[j];j--;}a[j+1]=x;}......
  • 算法基础上机实验——2023年5月8日
    01背包问题#include<iostream>usingnamespacestd;constintN=1010;intn,m;intv[N],w[N];intf[N];intmain(){cin>>n>>m;for(inti=1;i<=n;i++)cin>>v[i]>>w[i];for(inti=1;i<=......
  • 机器学习算法原理——逻辑斯谛回归
    文章目录逻辑斯谛回归二项逻辑斯谛回归模型极大似然估计多项逻辑斯谛回归模型总结归纳逻辑斯谛回归写在前面:逻辑斯谛回归最初是数学家Verhulst用来研究人口增长是所发现的,是一个非常有趣的发现过程,b站有更详细的背景及过程推导,在此不再赘述:https://www.bilibili.com/video/BV1N......
  • 电动汽车用内置式永磁同步电机基于查询表 的矢量控制算法, 自动生成?
    电动汽车用内置式永磁同步电机基于查询表的矢量控制算法,自动生成满足MTPA(最大转矩电流比/MTPV(最大转矩电压比)的dq轴电流参考值查询表。程序使用m脚本文件编写,将生成的查询表以C语言二维数组的形式输入到txt文本文件中,可直接复制到应用程序中,避免工程师对数据进行二次提......
  • 采用simulink仿真嵌入C语言实现了逆变器的搭建,整个仿真没有一个模块,所有算法均用C语言
    采用simulink仿真嵌入C语言实现了逆变器的搭建,整个仿真没有一个模块,所有算法均用C语言实现,并对C语言代码给出了详尽的注释。逆变器输出的电压THD仅有0.4%。可以根据这个例子写自己的算法,并把在simulink中写的代码直接移植到DSP或者别的控制器中的中断中,不需要做任何修改。ID:55200......
  • 在服务器中提交lammps计算时,用多少个核计算,才会使得自己和别人的运算会更快?是不是提交
    (摘自以下内容)下边我们做几组测试,并对比计算速度:(采用同一个模型,所含原子数:19144(算挺得多了))4个核——未超负荷运行100%情况下——1天能跑0.488ns=488ps26个核——超负荷10个核运行——1天能跑0.023ns=23ps56个核——超负荷40个核运行——1天能跑0.018ns=18ps126个核—......