图的初体验

news2024/11/17 23:49:15

最近周赛有两个差不多的题目,都是关于图的,之前也没有怎么练过关于图的题目,来记录一下。

T1

力扣T320周赛:T3:到达首都的最少油耗

class Solution {
    //结果
    long result ;

    public long minimumFuelCost(int[][] roads, int seats) {
	//存储和每个节点有连接的节点
        Map<Integer,List<Integer>> map = new HashMap<>();
        for(int[] road : roads){
            map.computeIfAbsent(road[0],t -> new ArrayList<>()).add(road[1]);
            map.computeIfAbsent(road[1],t -> new ArrayList<>()).add(road[0]);
        }
	//找路径
        for(int i : map.getOrDefault(0,new ArrayList<>())){
	    //从from=0开始找,找到所有与0连接的路,i为其中一个和0直接连接的路的开始
            minimumFuelCost(i,0,map,seats);
        }

        return result;
    }

    int minimumFuelCost(int n ,int from ,Map<Integer,List<Integer>> map,int seats){
	//不论到哪,油耗为1
        int count = 1;
        for(int i : map.get(n)){
	//如果当前节点和出发节点一致,那么油耗为0,否则根据该节点继续往下找,直到找到这条路结束
            count += i == from ? 0 : minimumFuelCost(i,n,map,seats);
        }
        result += (count + seats -1)/seats;
        return count;
    }
}

该题解的思路主要是:先将每个节点和他连接的记录起来,我们拿其中一个示例来说:
示例2:
image.png

输入:roads = [[3,1],[3,2],[1,0],[0,4],[0,5],[4,6]], seats = 2
输出:7
解释:
- 代表 2 到达城市 3 ,消耗 1 升汽油。
- 代表 2 和代表 3 一起到达城市 1 ,消耗 1 升汽油。
- 代表 2 和代表 3 一起到达首都,消耗 1 升汽油。
- 代表 1 直接到达首都,消耗 1 升汽油。
- 代表 5 直接到达首都,消耗 1 升汽油。
- 代表 6 到达城市 4 ,消耗 1 升汽油。
- 代表 4 和代表 6 一起到达首都,消耗 1 升汽油。
最少消耗 7 升汽油。。

经过map记录之后的结果为:

节点 -> 连接的其他节点
k=0,v=[1, 4, 5]
k=1,v=[3, 0]
k=2,v=[3]
k=3,v=[1, 2]
k=4,v=[0, 6]
k=5,v=[0]
k=6,v=[4]

我们对from=0的节点开始遍历,然后找到1,接着找到与1连接的3,然后找到与3连接的2,计算路经需要油耗,其他的类推,大致上整体是这么个过程。
但是我们不难发现,我们把座位拿掉之后,实际上就是找与该节点连接的子树的路径长,但是有座位限制,实际上就是几个节点一起出发一起去下一站,一起之后看做一个节点耗费一份油。

T2

OK这个题目看完了,我们再看一个类似的题目:

力扣T320周赛:T3:两个城市间路径的最小分数
这个题和上一提非常相似,但是没又上一题那么复杂,我们直接看代码

 public int minScore(int n, int[][] roads) {
        HashMap<Integer, List<int[]>> map = new HashMap<>();
        for (int[] road : roads) {
            map.computeIfAbsent(road[0], t -> new ArrayList<>()).add(new int[] { road[1], road[2] });
            map.computeIfAbsent(road[1], t -> new ArrayList<>()).add(new int[] { road[0], road[2] });
        }
        return minScore(1, map);
    }

    private int minScore(int n, HashMap<Integer, List<int[]>> map) {
        int min = Integer.MAX_VALUE;
        for (int[] next : map.replace(n, List.of())) {
            min = Math.min(min, Math.min(next[1], minScore(next[0], map)));
        }
        return min;
    }
}

这个题不多解释,跟上个题目类似。

总结

关于图的题目,基本上的思路就是,首先构造图的相连关系,给的数组表达的不清楚,我们需要清楚的知道,和a相连的都有谁,和b相连的都有谁…等待,如果有路径长度就在后面跟路径长度。
所以步骤就是:

  1. 先确定连通图
	//int[][] roads 
	//构造连通图,如果有路径key就用就用List<int[]>,int[0]为长连通状况,int[1]为路径长
	Map<Integer,List<Integer>> map = new HashMap<>();
        for(int[] road : roads){
            map.computeIfAbsent(road[0],t -> new ArrayList<>()).add(road[1]);
            map.computeIfAbsent(road[1],t -> new ArrayList<>()).add(road[0]);
        }

当连通之后,我们需要知道是从哪走,要到哪去,递归肯定避免不了的,关键是怎么递归。

  1. 确定开始路线
  • T1
   public long minimumFuelCost(int[][] roads, int seats) {
	....
	//第一题,题目要求都要到达0,所以就以0为起点找路径
        for(int i : map.getOrDefault(0,new ArrayList<>())){
	    //从from=0开始找,找到所有与0连接的路,i为其中一个和0直接连接的路的开始
            minimumFuelCost(i,0,map,seats);
        }

        return result;
    }

    int minimumFuelCost(int n ,int from ,Map<Integer,List<Integer>> map,int seats){
	........
    }


  • T2:

public int minScore(int n, int[][] roads) {
        ........
        //都要从1开始,找到最后一个节点,开头和结尾是固定,为了方便我们选择从头开始
        return minScore(1, map);
    }

 private int minScore(int n, HashMap<Integer, List<int[]>> map) {
   	........
    }

我们根据题意确定不同的起点,然后再根据题意往下继续找,就可以得到我们需要的解了。

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

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

相关文章

【推免攻略】四.2021年北交计算机学院夏令营、预推免保研经验

欢迎订阅本专栏&#xff1a;《北交计算机保研经验》 订阅地址&#xff1a;https://blog.csdn.net/m0_38068876/category_10779337.html 【推免攻略】一.北交计算机学院夏令营、预推免攻略【推免攻略】二.联系导师的前期准备及注意事项【推免攻略】三.2020年北交计算机学院夏令营…

如何能成为测试老大?先搞懂项目中的敏捷开发模式

1 什么是敏捷开发&#xff1f; 1、敏捷开发是以用户的需求进化为核心&#xff0c;采取迭代、循序渐进的方式来 进行软件项目的开发。 2、即将项目切分为多个子项目&#xff0c;每个子项目单独发布&#xff0c;保证软件较早可用。 3、及时收集用户反馈&#xff0c;调整未发布…

线性回归线性关系、非线性关系、常见函数导数、损失函数与优化算法、正规方程与单变量函数梯度下降、多变量函数梯度下降

一、线性回归概述 线性回归(Linear regression)&#xff1a;是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式 特点&#xff1a;只有一个自变量的情况称为单变量回归&#xff0c;多于一个自变量情况的叫做多元回归 特征值与目…

机器学习笔记之受限玻尔兹曼机(五)基于含隐变量能量模型的对数似然梯度

机器学习笔记之受限玻尔兹曼机——基于含隐变量能量模型的对数似然梯度引言回顾&#xff1a;包含配分函数的概率分布受限玻尔兹曼机——场景构建对比散度基于含隐变量能量模型的对数似然梯度引言 上一节介绍了对比散度(Constractive Divergence)思想&#xff0c;本节将介绍基于…

制造型企业如何进行多项目管理?这篇文章说清楚了

受经济全球化与科技迅速发展的影响&#xff0c;我国很多企业早已进入了多项目管理模式。多项目管理是从企业整体出发&#xff0c;动态选择不具有类似性的项目&#xff0c;对企业所拥有的或可获得的生产要素和资源进行优化组合&#xff0c;有效、最优地分配企业资源&#xff0c;…

葡聚糖修饰金纳米颗粒(Dex-AuNps)|聚环氧氯丙烷二甲胺修饰多孔磁性葡聚糖微球

葡聚糖修饰金纳米颗粒(Dex-AuNps)|聚环氧氯丙烷二甲胺修饰多孔磁性葡聚糖微球 产品描述&#xff1a;通过特异性识别作用在表面等离子体共振传感器的金膜表面构建了伴刀豆球蛋白A/葡聚糖修饰金纳米颗粒自组装膜 中文名称&#xff1a;葡聚糖修饰金纳米颗粒 英文名称&#xff1…

CMAKE编译知识

1&#xff0c;Ubuntu安装了cmake之后&#xff0c;直接输入指令查看版本。cmake -version 我这里的版本为3.16.3 2&#xff0c;使用visual studio里面创建一个CMake项目是最快可以看到的。但是一般无法理解。所以我找了网上资料。根据网上所说和自己再试错下。初步了解了cmake…

[附源码]JAVA毕业设计微博网站(系统+LW)

[附源码]JAVA毕业设计微博网站&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xf…

IAA游戏市场规模已达百亿,如何防范游戏安全问题?

近年来&#xff0c;移动休闲游戏市场发展速度迅猛&#xff0c;伽马数据发布的《2022年休闲游戏发展报告》称&#xff0c;2022年第一季度移动游戏下载量TOP200榜单中&#xff0c;休闲类游戏占比已达45%。 2022年第一季度下载量TOP200移动游戏占比情况丨数据来源伽马数据 相比IA…

MMCV学习——基础篇4(Hook)| 八千字:从设计模式到源码解读

MMCV学习——基础篇4&#xff08;Hook&#xff09; Hook 机制在MMCV的各个开源库中应用的十分广泛&#xff0c;它主要用于管理和扩展Runner的整个生命周期。通过Hook机制在Runner的各个生命周期节点调用自定义的函数&#xff0c;可以实现丰富的定制功能。 文章目录MMCV学习——…

【C语言航路】第八站:调试(第一幕)

前言 调试的这一站&#xff0c;对于市面上大部分的书籍都是缺失的&#xff0c;然而调试这个内容是非常重要的&#xff0c;尤其是在数据结构部分&#xff0c;将会频繁的使用&#xff0c;这也为我们后面讲解数据结构做一个铺垫。同时&#xff0c;在以后未来工作的时候&#xff0…

Generative Cooperative Learning for Unsupervised Video Anomaly Detection

介绍 在现实世界中&#xff0c;基于学习的异常检测任务极具挑战性&#xff0c;这主要是因为此类事件很少发生。由于这些事件的无约束性质&#xff0c;这一挑战进一步加剧。因此&#xff0c;获取足够的异常示例是相当麻烦的&#xff0c;而人们可以安全地假设&#xff0c;将永远…

Xcode9 无证书真机调试​

写在前面​ 公司分配了新的测试机,证书99台名额已满,所以上网找教程,学习了一下如何使用Xcode无证书进行真机调试。​ 一. 创建证书​ 1. 运行Xcode&#xff0c; Xcode–》Preference–》添加账号&#xff08;能在appstore下载的账号&#xff09;​ 2. 选中刚才添加的AppleID…

光华股份在深交所上市:市值突破51亿元,前三季度收入约10亿元

12月8日&#xff0c;浙江光华科技股份有限公司&#xff08;下称“光华股份”&#xff0c;SZ:001333&#xff09;在深圳证券交易所主板上市。本次上市&#xff0c;光华股份的发行价格27.76元/股&#xff0c;发行数量为3200万股&#xff0c;募资总额约为8.88亿元&#xff0c;扣除…

JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK11特性讲解】

JDK各个版本特性讲解-JDK11特性 lecture&#xff1a;波哥 一、JAVA11 概述 2018年9月26日,Oracle官方发布JAVA11.这是JAVA大版本周期变化后的第一个长期支持版本,非常值得关注.最新发布的JAVA11将带来ZGC HttpClient等重要特性,一共17个需要我们关注的JEP,参考文档http://openj…

Docker_简介、优势、架构、常用命令

Docker简介 Docker是什么 Docker就是将环境在不消耗大量资源的情况下复制出一个一样的环境 一次镜像&#xff0c;处处运行 内核级虚拟化 基于GO语言实现的开源项目 解决运行环境和配置问题的软件容器 容器与虚拟机比较 虚拟机是模拟的整套操作系统&#xff0c;会有资源占用…

Unity Cg着色器开发教程

Unity Cg着色器开发教程 学习在 Unity 中对图形管道进行编程&#xff0c;以便为游戏对象创建独特的视觉表面 课程英文名&#xff1a;Shader Development from Scratch for Unity with Cg 此视频教程共2.0小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0c…

代码随想录算法训练营第二天| 977.有序数组的平方, 209.长度最小的子数组, 59.螺旋矩阵II

代码随想录算法训练营第二天| 977.有序数组的平方&#xff0c; 209.长度最小的子数组&#xff0c; 59.螺旋矩阵II 题目链接: 977.有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排…

ASEMI整流桥KBU610和KBP210封装参数区别

编辑-Z 很多人在选型时容易把KBU和KBP给搞混&#xff0c;这两种封装是有区别的&#xff0c;下面是整流桥KBU610和KBP210封装参数区别。 整流桥KBU610参数&#xff1a; 型号&#xff1a;KBU610 封装&#xff1a;KBU-4 最大重复峰值反向电压&#xff08;VRRM&#xff09;&…

1557_AURIX_TC275_复位控制单元以及相关寄存器

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这是之前没看完的一张表&#xff0c;结合之前的一般看起来&#xff0c;大部分的模块还是支持重启机制的。 状态寄存器中可以读到上一次复位的触发原因&#xff0c;这个对于软件的一些状态判…