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

算法 之 拓 扑 排 序

文章目录

    • 拓扑排序
    • 拓扑排序+dp解决工程完成时间

拓扑排序

  • 拓扑排序,常用于这个课程表安排类型的,对于一个抽象为一个有向无环图,经过排序之后,排序之后的元素x,y,仍然保持着在原来的有向无环图当中,x->y,也就是前后的顺序仍然不变

灵神讲解

  • 讲一下拓扑排序的思路:
    • 首先输入的是一个边的关系edges[i] = [x,y]表示,存在x->y的有向边,我们需要将这个边,使用邻接表存储起来,同时还使用一个数组存储每一个顶点的入度数量
    • 使用一个队列来存储候选将要拓展的节点,当然一开始,加入队列的元素就是入度为0的节点
    • 选取队列中的元素,加入最终的排序的数组中,同时,对于以该元素作为起始节点的边所对应的节点的入度数量应该-1,同时判断,将新的入度数量为0的节点加入候选队列当中
    • 如果最终,排序的元素数量少于总的节点数量,则说明存在环
// 返回有向无环图(DAG)的其中一个拓扑序
// 如果图中有环,返回空列表
// 节点编号从 0 到 n-1
vector<int> topologicalSort(int n, vector<vector<int>>& edges) {vector<vector<int>> g(n);vector<int> in_deg(n);for (auto& e : edges) {int x = e[0], y = e[1];g[x].push_back(y);in_deg[y]++; // 统计 y 的先修课数量}queue<int> q;for (int i = 0; i < n; i++) {if (in_deg[i] == 0) { // 没有先修课,可以直接上q.push(i); // 加入学习队列}}vector<int> topo_order;while (!q.empty()) {int x = q.front();q.pop();topo_order.push_back(x);for (int y : g[x]) {in_deg[y]--; // 修完 x 后,y 的先修课数量减一if (in_deg[y] == 0) { // y 的先修课全部上完q.push(y); // 加入学习队列}}}if (topo_order.size() < n) { // 图中有环return {};}return topo_order;
}

拓扑排序+dp解决工程完成时间

  • 拓扑排序,适合处理有向无环图当中,解决活动先后顺序的安排,当然,我们也可以计算出完成全部的活动所需的最少时间
  • 我们定义dp[i]为完成任务i的最早完成时间,那么就有递推公式dp[i] = max(dp[j) +time[i],其中dp[j]j->i的节点

2050.并行课程 III
在这里插入图片描述

  • 思路分析:
    • 解决的方法,也就是在出候选队列的时候,我们在更新入度节点的时候,同时更新这个dp[i]即可
class Solution {
public:int minimumTime(int n, vector<vector<int>>& relations, vector<int>& time) {// 拓扑排序+dpvector<int> dp(n+1);vector<int> ine(n+1);vector<vector<int>> e(n+1);queue<int> q;for (auto p : relations){int u = p[0],v = p[1];e[u].push_back(v);ine[v]++;}// 初始化队列for (int i = 1; i <= n; i++){if (ine[i] == 0){q.push(i);dp[i] = time[i-1];}}// 开始排序while (q.size()){int x = q.front();q.pop();for (auto c : e[x]){ine[c]--;dp[c] = max(dp[c],dp[x] + time[c-1]);if (ine[c] == 0){q.push(c);}}}// 遍历完,找到这个最大的dpint ans = 0;for (int i = 1;i <= n; i++){cout << dp[i] << " ";ans = max(ans,dp[i]);}return ans;}
};
http://www.xdnf.cn/news/18433.html

相关文章:

  • Pycharm SSH连接
  • Android15 AndroidV冻结和解冻的场景
  • 学习Linux嵌入式(正点原子imx课程)开发到底是在学什么
  • 【Linux | 网络】多路转接IO之select
  • Python 面向对象编程入门:从思想到属性操作
  • 图(Graph):关系网络的数学抽象
  • 3维模型导入到3Dmax中的修改色彩简单用法----第二讲
  • 零成本加速:EdgeOne免费套餐3分钟接入指南
  • MYSQL库及表的操作
  • 奈飞工厂:算法优化实战 —— 从推荐系统到内容分发
  • Python工程师向项目管理转型的深度分析与学习道路规划
  • 《用餐》,午餐食堂即景小诗分享(手机/小视频/光盘/养生)
  • AI + 云原生 + ITSM 的三重融合:企业数字化转型的新引擎
  • 面试准备革命:面试汪 vs 传统方法,谁更胜一筹?
  • 搭建我的世界mc服务器全流程——阿里云游戏攻略
  • 相似图像处理程序
  • 北京-15k测试-入职甲方金融-上班第二天
  • 哈尔滨云前沿服务器租用类型
  • 高效获取应用程序图标的方法
  • CSS 3D动画,围绕旋转动画Demo
  • 面试可能问到的问题思考-Redis
  • 机器学习7
  • 网络与信息安全有哪些岗位:(5)安全开发工程师
  • Ubuntu22.04配置网络上网
  • Ubuntu Server 安装 gvm 管理 Go 语言开发环境
  • 自然语言处理NLP L4: 高级语言模型——四种泛化平滑方式
  • 【TrOCR】用Transformer和torch库实现TrOCR模型
  • Matplotlib+HTML+JS:打造可交互的动态数据仪表盘
  • 智慧工厂的 “隐形大脑”:边缘计算网关凭什么重构设备连接新逻辑?
  • 详细说明http协议特别是conten-length和chunk编码,并且用linux的命令行演示整个过程