代码随想录算法训练营第58天|卡码网 117. 软件构建、47. 参加科学大会

news/2024/12/22 18:07:07/

1. 卡码网 117. 软件构建

题目链接:https://kamacoder.com/problempage.php?pid=1191
文章链接:https://www.programmercarl.com/kamacoder/0117.软件构建.html

在这里插入图片描述
思路:使用BFS
BFS的实现思路:
拓扑排序的过程,其实就两步:
1.找到入度为0 的节点,加入结果集
2.将该节点从图中移除
循环以上两步,直到 所有节点都在图中被移除了。
结果集的顺序,就是我们想要的拓扑排序顺序 (结果集里顺序可能不唯一)

java">import java.util.*;public class Main {public static void main (String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(); //  文件数量int m = sc.nextInt(); //  依赖关系int[] inDegree = new int[n];Map<Integer,List<Integer>> map = new HashMap<>();for (int i=0;i<m;i++) {int s = sc.nextInt();int t = sc.nextInt();inDegree[t]++;List<Integer> list = map.getOrDefault(s,new ArrayList<>());list.add(t);map.put(s,list);}Deque<Integer> deque = new ArrayDeque<>();for (int i=0;i<n;i++) {if (inDegree[i] == 0) {deque.offer(i); // 注意:使用队列保存入度为0的节点。}}List<Integer> res = new ArrayList<>(); // 结果集while (!deque.isEmpty()) {// 1.找到入度为0的节点,并加入结果集int s = deque.poll();res.add(s);List<Integer> files = map.get(s); // 获取所有依赖s的集合if (files == null) {continue;}for (Integer t:files) {// 2.将s节点从图中移除inDegree[t]--; if (inDegree[t] == 0) {deque.offer(t);}}}if (res.size() != n) {System.out.println(-1);} else {for (int i=0;i<res.size()-1;i++) {System.out.print(res.get(i));System.out.print(" ");}System.out.print(res.get(res.size() - 1));}}
}

2. 卡码网 47. 参加科学大会

题目链接:https://kamacoder.com/problempage.php?pid=1047
文章链接:https://www.programmercarl.com/kamacoder/0047.参会dijkstra朴素.html

在这里插入图片描述

思路:本题是求最短路径问题。可以使用dijkstra算法
dijkstra算法:在有权图(权值非负数)中求从起点到其他节点的最短路径算法
dijkstra三部曲:
1.第一步,选源点到哪个节点近且该节点未被访问过
2.第二步,该最近节点被标记访问过
3.第三步,更新非访问节点到源点的距离(即更新minDist数组)
minDist数组 用来记录 每一个节点距离源点的最小距离。这里的源点指的是起始点,即本题中的节点1。
需要注意两点:

  • dijkstra 算法可以同时求 起点到所有节点的最短路径
  • 权值不能为负数 (注意这里)。
java">import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(); // 公共汽车站数量int m = sc.nextInt(); // 公路数量int[][] timeArray = new int[n+1][n+1];for (int i=0;i<n;i++) {Arrays.fill(timeArray[i],Integer.MAX_VALUE);}// 构建邻接矩阵for (int i=0;i<m;i++) {int s = sc.nextInt();int e = sc.nextInt();int v = sc.nextInt();timeArray[s][e] = v; // 注意:这里只对[s][e]填值,而最小生成树也会对[e][s]填值}// 节点是否被访问到boolean[] visited = new boolean[n+1];// 所有节点到源点到最短时间int[] minTime = new int[n+1];Arrays.fill(minTime,Integer.MAX_VALUE);minTime[1] = 0; // 节点1到源点的时间为0for (int t=1;t<=n;t++) {// 1. 寻找所有未访问节点中到源点最短时间的节点int min = Integer.MAX_VALUE;int cur = 1;for (int i=1;i<=n;i++) {if (!visited[i] && minTime[i] < min) {min = minTime[i];cur = i;}}// 2. 标记被访问visited[cur] = true;// 3. 更新所有未被访问节点到源点的最短时间// 注意:这里只更新与cur直连的节点 由其判断:timeArray[cur][i] != Integer.MAX_VALUE for (int i=1;i<=n;i++) {if (!visited[i]  && timeArray[cur][i] != Integer.MAX_VALUE && timeArray[cur][i] + minTime[cur] < minTime[i]) {minTime[i] = timeArray[cur][i] + minTime[cur];}}}// 未访问到最终节点if (minTime[n] == Integer.MAX_VALUE) {System.out.println(-1);return;}System.out.println(minTime[n]);}
}

http://www.ppmy.cn/news/1530745.html

相关文章

Linux、Windows、Android下查看可执行文件、动态库和静态库信息的命令

TL; DR 我常用的命令&#xff1a; Linux lddWindows&#xff08;需要借助vs&#xff09; dumpbin /DEPENDENTSAndroid ldd 绝对路径在不同的操作系统下&#xff0c;查看可执行文件、动态库和静态库的命令各不相同。以下是 Linux、Windows 和 Android 平台下的常用命令&…

开源推理库介绍:ZML,Distributed Llama,EXO | LeetTalk Daily

“LeetTalk Daily”&#xff0c;每日科技前沿&#xff0c;由LeetTools AI精心筛选&#xff0c;为您带来最新鲜、最具洞察力的科技新闻。 开源推理库的出现为机器学习模型的部署、监控和扩展提供了强大的支持。我们介绍三个重要的开源推理库&#xff1a;ZML、Distributed Llama …

LiveQing视频点播流媒体RTMP推流服务功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大

LiveQing视频点播流媒体RTMP推流服务功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大 1、鉴权直播2、视频点播3、RTMP推流视频直播和点播流媒体服务 1、鉴权直播 鉴权直播-》播放 &#xff0c;左键单击可以拉取矩形框&#xff0c;放大选中的范围&#x…

react crash course 2024(2) 创建项目及vscode插件

使用vite创建react项目 npm create vitelatest react-crash-2024 跳到那个项目 cd .\react-crash-2024 打开那个项目 code . 在vite.config.js中设置端口 安装依赖 npm i 运行 npm run dev vs code插件 rafce //在底部导出的react箭头函数组件

【NLP】daydayup 循环神经网络基本结构,pytorch实现

RNN 循环神经网络 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种神经网络结构&#xff0c;专门用于处理序列数据。 RNN结构原理 RNN架构中&#xff0c;网络通过循环把信息从一个处理步骤传递到下一个&#xff0c;这个循环结构被称为隐…

Springboot的两种配置文件语法详细介绍、properties与yml的区别、application.properties不可以用双引号?

文章目录 一、properties语法介绍二、yaml语法介绍三、总结3.1、properties与yml的区别3.2、properties不可以用双引号&#xff1f; 本篇文章介绍一下springboot两种配置文件properties与yml的区别&#xff0c;以及两种文件的写法 一、properties语法介绍 ‌Properties‌文件…

为什么推荐使用英文版LabVIEW

在LabVIEW开发中&#xff0c;中文版和英文版主要在界面语言、功能习惯以及社区支持等方面存在差异。以下是两者的特点以及推荐使用英文版的原因&#xff1a; 中文版特点&#xff1a; 界面和帮助文档为中文&#xff1a;对于中文母语开发者来说&#xff0c;中文版LabVIEW的界面和…

51单片机快速入门之按键应用拓展

51单片机快速入门之按键应用拓展 LED的点动控制: 循环检测,当key 为0 时 led 亮 反之为熄灭 while(1){ if(key!1) { led0; }else { led1; } } LED的锁定控制: 当按钮按下,led取反值 while(1) { if(key!1) { led!led; } } LED的4路抢答控制: bz默认为0 !bz 取反值,循环启动…