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

代码随想录算法训练营第五十八天|动态规划part8

拓扑排序精讲


文章讲解:代码随想录

题目链接:117. 软件构建

拓扑排序是经典的图论问题

给出一个 有向图,把这个有向图转成线性的排序 就叫拓扑排序

拓扑排序也是图论中判断有向无环图的常用方法
判断方法:结果集元素个数 不等于 图中节点个数,我们就可以认定图中一定有 有向环!

算法步骤:

1.找到入度为0的节点 ,加入结果集

2.删除该节点 和该节点相连的边

循环以上两步,直到 所有节点都在图中被移除了。

#include <iostream>
#include <vector>
#include <unordered_map>
#include <queue>
using namespace std;
int main(){//数据准备int n, m;cin>>n>>m;vector<int>inDegree(n,0);  vector<int>ans;unordered_map<int,vector<int>>mp;queue<int>mq;for(int i=0;i<m;i++){int s,t;cin>>s>>t;inDegree[t]++;mp[s].push_back(t);}for(int i=0;i<inDegree.size();i++){if(inDegree[i]==0) mq.push(i);}//循环操作入度为0的点while(!mq.empty()){int cur=mq.front();mq.pop();ans.push_back(cur);auto curEdges=mp[cur];if(curEdges.size()){  //删除该节点相连的边for(int i=0;i<curEdges.size();i++){inDegree[curEdges[i]]--;if(inDegree[curEdges[i]]==0) mq.push(curEdges[i]);}}}if(ans.size()==n){for(int i=0;i<ans.size()-1;i++){cout<<ans[i]<<' ';}cout<<ans[ans.size()-1];}else{cout<<-1;}}

dijkstra(朴素版)精讲

文章讲解:代码随想录

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

在更新 minDist[v] 时,需要检查 grid[curVertex][v] 是否为 INT_MAX,防止 整数溢出INT_MAX + 正数 会溢出成负数)。

dijkstra三部曲

  1. 第一步,选源点到哪个节点近且该节点未被访问过
  2. 第二步,该最近节点被标记访问过
  3. 第三步,更新非访问节点到源点的距离(即更新minDist数组)
#include <iostream>
#include <vector>
#include <climits>using namespace std;int main(){int n,m;cin>>n>>m;vector<vector<int>>grid(n+1,vector<int>(n+1,INT_MAX));vector<int>minDist(n+1,INT_MAX);for(int i=0;i<m;i++){int s,e,v;cin>>s>>e>>v;grid[s][e]=v;}vector<bool>isVisited(n+1,false);int start=1;int end=n;minDist[start]=0;for(int i=1;i<=n;i++){int min=INT_MAX;int curVertex;//找距离源节点最近没有被访问过的点for(int v=1;v<=n;v++){if(!isVisited[v]&&minDist[v]<min){curVertex=v;min=minDist[v];}}//标记为已访问isVisited[curVertex]=true;//更新minDist数组for(int v=1;v<=n;v++){if(!isVisited[v]&&grid[curVertex][v]!=INT_MAX&&grid[curVertex][v]+minDist[curVertex]<minDist[v]){minDist[v]=grid[curVertex][v]+minDist[curVertex];}}}if(minDist[end]==INT_MAX) cout<<-1;else cout<<minDist[end];}

http://www.dtcms.com/a/313390.html

相关文章:

  • 成功解决ImportError: DLL load failed while importing _multiarray_umath: 找不到指定的模块。
  • 深度学习中的模型知识蒸馏
  • 深度学习中卷积与互相关
  • 记录使用ruoyi-flowable开发部署中出现的问题以及解决方法
  • FastAPI-Vue3-Admin 一款Python 全栈融合的高可用中后台快速开发平台方案
  • golang 函数选项模式
  • 数据结构(概念及链表)
  • 【数据结构】队列的顺序存储与链式存储(C语言版)
  • 基于深度学习的医学图像分析:使用变分自编码器(VAE)实现医学图像生成
  • (FD Conv)Frequency Dynamic Convolution for Dense Image Prediction论文精读(逐段解析)
  • 07.config 命令实现动态修改配置和慢查询
  • [硬件电路-138]:模拟电路 - 什么是正电源?什么是负电源?集成运放为什么有VCC+和VCC-
  • Unix 发展史概览
  • 探索 Zephyr 项目:高效、可扩展的实时操作系统
  • 源代码本地安装funasr
  • C语言数据结构(6)贪吃蛇项目1.贪吃蛇项目介绍
  • 有限元方法中的数值技术:三角矩阵求解
  • Vulnhub Corrosion2靶机复现
  • 机器人抓取流程介绍与实现——机器人抓取系统基础系列(七)
  • 腾讯云CentOS7镜像配置指南
  • Pytorch实现一个简单的贝叶斯卷积神经网络模型
  • Java 中也存在类似的“直接引用”“浅拷贝”和“深拷贝”
  • [创业之路-530]:创业公司五维架构设计:借鉴国家治理智慧,打造敏捷型组织生态
  • mysql8.0集群技术
  • 第13章 文件输入/输出
  • 知识蒸馏 - 基于KL散度的知识蒸馏 HelloWorld 示例 KL散度公式对应
  • 文件拷贝-代码
  • Doris json_contains 查询报错
  • 数据结构总纲以及单向链表详解:
  • 【LeetCode刷题指南】--对称二叉树,另一颗树的子树