当前位置: 首页 > news >正文

算法打卡:第十一章 图论part08

今日收获:拓扑排序,dijkstra算法

算法讲解部分均来源于代码随想录

1. 拓扑排序

基础知识:

(1)应用场景:给出有向图,将有向图转换为线性的排序就叫拓扑排序(如果图中有环则存在循环依赖,不能做线性排序,所以拓扑排序也可以用来判断有向图中是否有环)

(2)解法:卡恩算法(BFS广度优先搜索)

(3)步骤:

  • 找到入度为0的点加入结果集
  • 将该节点从图中移除

(4)图中有环:此时找不到入度为0的点,所以结果集的长度小于节点个数

题目链接:117. 软件构建 (kamacoder.com)

方法:

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];// 记录依赖关系List<List<Integer>> edges=new ArrayList<>(N);for (int i=0;i<N;i++){edges.add(new ArrayList<>());}// 接收依赖关系for (int i=0;i<M;i++){int s=sc.nextInt();int t=sc.nextInt();edges.get(s).add(t);  // 依赖于s的边inDegree[t]++;}// 队列存储入度为0的节点Queue<Integer> queue=new LinkedList<>();for (int i=0;i<N;i++){if (inDegree[i]==0){queue.offer(i);}}// 存储结果List<Integer> result=new ArrayList<>();while (!queue.isEmpty()){int cur=queue.poll();result.add(cur);// 将相连节点的入度减一for (int edge:edges.get(cur)){inDegree[edge]--;if (inDegree[edge]==0){queue.offer(edge);}}}// 判断是否存在环if (result.size()==N){for (int i=0;i<result.size()-1;i++){System.out.print(result.get(i)+" ");}System.out.print(result.get(N-1));}else {System.out.println(-1);}}
}

2. dijkstra算法

基础知识:

(1)求最短路径问题:给出有向图,求起点到终点的最短路径。

(2)dijkstra算法:有向图中边的权值均为非负数;可以求起点到其他节点的最短路径算法

(3)dijkstra三部曲:minDist数组用来记录每一个节点距离源点的最小距离。

  • 第一步,选源点到哪个节点近且该节点未被访问过
  • 第二步,该最近节点被标记访问过
  • 第三步,更新非访问节点到源点的距离(即更新minDist数组)

(4)如果需要打印边,和prim算法一样,在更新minDist数组时记录父节点

(5)和prim算法的区别:

  • prim是求非访问节点到最小生成树的最小距离
  • dijkstra是求非访问节点到源点的最小距离,源点是固定的

(6)要求非负权值是因为,此算法后续节点距离源节点的距离=前面节点到源节点的距离+本边的权值,后面的节点一定要比前面已加入路径中的节点成本大

题目链接:47. 参加科学大会(第六期模拟笔试) (kamacoder.com)

方法:

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();boolean[] visited=new boolean[N+1]; // 记录是否访问int[][] grid=new int[N+1][N+1];  // 记录所有的边,初始化为不可达for(int i=0;i<N+1;i++){Arrays.fill(grid[i],Integer.MAX_VALUE);}for (int i=0;i<M;i++){int s=sc.nextInt();int e=sc.nextInt();int v=sc.nextInt();grid[s][e]=v;}int[] minDist=new int[N+1];  // 其他点到源点的最小距离for (int i=0;i<N+1;i++){minDist[i]=Integer.MAX_VALUE;}minDist[1]=0;// 求到原点的最小距离for (int i=1;i<N+1;i++){int cur=-1;int minD=Integer.MAX_VALUE;// 选择最小节点for (int j=1;j<N+1;j++){if (minDist[j]<minD&&!visited[j]){cur=j;minD=minDist[j];}}if (cur==-1){break;}// 标记访问visited[cur]=true;// 更新其他节点for (int j=1;j<N+1;j++){if (minDist[cur]+grid[cur][j]<minDist[j]&&!visited[j]&&grid[cur][j]!=Integer.MAX_VALUE){minDist[j]=minDist[cur]+grid[cur][j];}}}if (minDist[N]==Integer.MAX_VALUE){System.out.println(-1);}else {System.out.println(minDist[N]);}}
}

相关文章:

  • 在C#中使用JSON
  • 【test】google cloud
  • Vxe UI vue vxe-table vxe-grid 单元格与表尾单元格如何格式化数据
  • 微服务--初识MQ
  • 车辆重识别(去噪扩散概率模型)论文阅读2024/9/27
  • centos7 yum 更新 nginx 到最新版本 1.26
  • 酒水速送小程序开发制作方案
  • 传奇架设教程:传奇登录器公告窗口如何设置?link.htm网页文件制作教程
  • TPAMI 2024 | 数据不平衡克星,ProCo算法:长尾视觉识别的终极解决方案!
  • Django中媒体文件的配置
  • **CentOS7安装Maven**
  • 20 基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)
  • 常用性能优化方法
  • 使用Jlink打印单片机的调试信息
  • 数据结构编程实践20讲(Python版)—04队列
  • ES6系列(二)变量的解构赋值
  • github指令
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • ReactNativeweexDeviceOne对比
  • Spring核心 Bean的高级装配
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • vue-cli在webpack的配置文件探究
  • 百度小程序遇到的问题
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 看域名解析域名安全对SEO的影响
  • 每天10道Java面试题,跟我走,offer有!
  • 排序算法学习笔记
  • 判断客户端类型,Android,iOS,PC
  • 人脸识别最新开发经验demo
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 微信小程序设置上一页数据
  • ​configparser --- 配置文件解析器​
  • ###C语言程序设计-----C语言学习(6)#
  • #define、const、typedef的差别
  • $(function(){})与(function($){....})(jQuery)的区别
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (k8s)kubernetes集群基于Containerd部署
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)http-server应用
  • ***监测系统的构建(chkrootkit )
  • .net core使用ef 6
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 通过系统影子账户实现权限维持
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • @Conditional注解详解
  • @JsonFormat与@DateTimeFormat注解的使用
  • @PreAuthorize与@Secured注解的区别是什么?
  • @Query中countQuery的介绍
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [20181219]script使用小技巧.txt
  • [Avalon] Avalon中的Conditional Formatting.
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [C++]——带你学习类和对象
  • [Doc][ROS2]订阅发布、服务客户端区别