代码随想录算法训练营第58天| 图论 拓扑排序 dijkstra算法

2024-08-28 09:04

本文主要是介绍代码随想录算法训练营第58天| 图论 拓扑排序 dijkstra算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

拓扑排序:

听起来是排序实际上是图论问题。对于一个有向图,把这个有向图转化成线性的排序,就叫拓扑排序。实际上是按先后顺序输出需要处理的事件。 实现拓扑排序有两种方法,一种是BFS,另一种是DFS。如果要使用BFS,可以先通过入度为0判断起点是哪个点,只要遍历一遍所有边计算所有点的入度就可以找到起点了。在将该节点加入结果集之后删除,继续寻找集合中入度为0的点加入结果集然后再删除,所以如果出现多个入度为零的点,随便选一个加入结果集就可以,因此拓扑排序结果可以不唯一。

卡码网:117.软件构件

题目链接:117. 软件构建

思路:通过遍历关系计算每个事件的入度。找到入度为零的事件,建立队列,把这个事件入队,寻找所有关系中以这个事件为前提的事件,将他们的入度-1,如果入度==0,那么这个事件入队,把这个事件为前提的关系遍历完之后,这个事件出队。剩下队列内的元素按相同逻辑处理,最后按出队顺序输出的事件就是需要的排序。

代码:

#include<iostream>
using namespace std;
#include<vector>
#include<queue>
#include<unordered_map>int main(){int m,n,s,t;cin>>n>>m;vector<int> inDegree(n,0);//记录每个文件的入度unordered_map<int, vector<int>> umap;//记录文件的依赖关系vector<int> result;for(int i=0;i<m;i++){cin>>s>>t;//s->t 先有s才能有tinDegree[t]++;//所以加的是t的入度umap[s].push_back(t);//s可能不止指向一个事件}queue<int> que;//用来存放入度为0的事件的队列for(int i=0;i<n;i++){//入度为0的事件加入队列if(inDegree[i]==0) que.push(i);}while(!que.empty()){int cur = que.front();que.pop();result.push_back(cur);vector<int> files = umap[cur];//获取这个事件指向的事件for(int i=0;i<(int)files.size();i++){inDegree[files[i]]--;//去掉起始点之后这些点的入度-1if(inDegree[files[i]]==0) que.push(files[i]);//把操作之后入度为0的点进入队列}}if (result.size() == n) {for (int i = 0; i < n - 1; i++) cout << result[i] << " ";cout << result[n - 1];} else cout << -1 << endl;return 0;
}

dijkstra算法:

也是求最短路径的经典算法。和prim算法求最小生成树接近。首先找到距离源点最近的点加入结果集,然后更新加入之后其他点到达源点的最短距离。dijkstra三部曲:1.选源点到哪个节点近而且该节点未被访问过;2.将该节点标记为访问过;3.更新非访问节点到源点的距离。

卡码网:47. 参加科学大会(第六期模拟笔试)

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

代码:

#include<iostream>
#include<vector>
#include <climits>
using namespace std;int main(){int n,m,p1,p2,val;cin>>n>>m;vector<vector<int>> grid(n+1,vector<int>(n+1,INT_MAX));for(int i=0;i<m;i++){cin>>p1>>p2>>val;grid[p1][p2]=val;//从一个点到下一个点距离 也就是边的权值}int start =1;int end =n;//分别是起点和终点的下标vector<int> minDist(n+1,INT_MAX);//从源点到某个点的最短距离vector<bool> visited(n+1, false);//某个点是否被访问过minDist[start]=0;//源点到自身距离为0for(int i=1;i<=n;i++){int minVal=INT_MAX;int cur=1;//寻找距离源点(下标1)最近的节点for(int j=1;j<=n;j++){if(!visited[j]&&minDist[j]<minVal){//出现更小的距离则替换minVal=minDist[j];cur=j;}}visited[cur]=true;//将该节点标记为truefor(int j=1;j<=n;j++){if(!visited[j]&&grid[cur][j]!=INT_MAX&&minDist[cur]+grid[cur][j]<minDist[j]){minDist[j]=minDist[cur]+grid[cur][j];}}}if(minDist[end]==INT_MAX) cout<<-1;else cout<<minDist[end];return  0;
}

这篇关于代码随想录算法训练营第58天| 图论 拓扑排序 dijkstra算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Java强制转化示例代码详解

《Java强制转化示例代码详解》:本文主要介绍Java编程语言中的类型转换,包括基本类型之间的强制类型转换和引用类型的强制类型转换,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录引入基本类型强制转换1.数字之间2.数字字符之间引入引用类型的强制转换总结引入在Java编程语言中,类型转换(无论

Vue 调用摄像头扫描条码功能实现代码

《Vue调用摄像头扫描条码功能实现代码》本文介绍了如何使用Vue.js和jsQR库来实现调用摄像头并扫描条码的功能,通过安装依赖、获取摄像头视频流、解析条码等步骤,实现了从开始扫描到停止扫描的完整流... 目录实现步骤:代码实现1. 安装依赖2. vue 页面代码功能说明注意事项以下是一个基于 Vue.js

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快