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

数据结构与算法:图论——拓扑排序

基础与模板:

image-20250526215305308

有两个KahnDFS两个算法

下面给出Kahn的算法模板

image-20250526232619234

#include<iostream>
#include<vector>
#include<queue>
using namespace std;vector<int> topologicalSortKahn(int num, const vector<pair<int, int>>& relations){vector<int> result;vector<int> inDegree(num+1,0);	// 记录所有节点的入度vector<vector<int>> adj(num+1);	// 用于记录节点的连接的节点for(const auto &rel:relations){int from = rel.first;int to	 = rel.second;adj[from].push_back(to);	// 写入每个节点连接的节点inDegree[to]++;				// 写入入度}queue<int> q;					// 用于记录入度为0的节点// 遍历节点,把入度为0的点写入q// 这里需要注意节点到底是从0开始还是从1开始for(int i = 0;i< num;++i){if(inDegree[i] == 0){q.push(i);}}// 提取入度为0的节点,删除其连接,不断更新入度while(!q.empty()){int current= q.front();q.pop();result.push_back(current);		for(int next : adj[current]){inDegree[next]--;		// 每个下一节点的入度减1if(inDegree[next]==0){	// 入度减1后判断为0加入qq.push(next);}}}if(result.size() != num) return{-1}; // 判断是环,返回-1return result;
}int main(){int N,M;cin>>N>>M; vector<pair<int,int>>  inRelation;int from,to;while(M--){cin>>from>>to;inRelation.emplace_back(pair<int,int>{from,to});}vector<int> res = topologicalSortKahn(N,inRelation);for(size_t i = 0;i < res.size()-1;i++){cout<<res[i]<<" ";}cout<<res.back();
}

图的拓扑排序题目leetcode

题号标题题解标签难度
0207课程表Python深度优先搜索、广度优先搜索、图、拓扑排序中等
0210课程表 IIPython深度优先搜索、广度优先搜索、图、拓扑排序中等
1136并行课程Python图、拓扑排序中等
2050并行课程 IIIPython图、拓扑排序、数组、动态规划困难
0802找到最终的安全状态Python深度优先搜索、广度优先搜索、图、拓扑排序中等
0851喧闹和富有Python深度优先搜索、图、拓扑排序、数组中等

题目1、117. 软件构建

卡吗网代码编辑真不错

image-20250526232851715

直接套模板

image-20250526233030925

题目2、210. 课程表 II

image-20250526233213153

class Solution {
public:vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {vector<int> result;vector<int> inDegree(numCourses+1,0);	// 记录所有节点的入度vector<vector<int>> adj(numCourses+1);	// 用于记录节点的连接的节点for(const auto &rel:prerequisites){int from = rel[0];int to	 = rel[1];adj[from].push_back(to);	// 写入每个节点连接的节点inDegree[to]++;				// 写入入度}queue<int> q;					// 用于记录入度为0的节点// 遍历节点,把入度为0的点写入q// 这里需要注意节点到底是从0开始还是从1开始for(int i = 0;i< numCourses;++i){if(inDegree[i] == 0){q.push(i);}}// 提取入度为0的节点,删除其连接,不断更新入度while(!q.empty()){int current= q.front();q.pop();result.push_back(current);		for(int next : adj[current]){inDegree[next]--;		// 每个下一节点的入度减1if(inDegree[next]==0){	// 入度减1后判断为0加入qq.push(next);}}}if(result.size() != static_cast<size_t>(numCourses)) return{}; // 判断是环,返回{}return result;}
};

image-20250526234525735

题目3、任务调度算法

image-20250518151906514
image-20250518151919137

image-20250527102602838
#include <vector>
#include <utility>
#include <queue>
#include <algorithm>using namespace std;class Solution {
public:int GetMinT	ime(int taskNum, const vector<pair<int, int>>& relations){vector<vector<int>> adj(taskNum+1);vector<int> inDegree(taskNum + 1, 0);vector<int> dp(taskNum + 1, 1);for (const auto& rel : relations) {int from = rel.second; int to = rel.first;    adj[from].push_back(to);inDegree[to]++;}queue<int> q;for (int i = 1; i <= taskNum; ++i) {if (inDegree[i] == 0) {q.push(i);}}while (!q.empty()) {int current = q.front();q.pop();for (int next : adj[current]) {dp[next] = max(dp[next], dp[current] + 1);if (--inDegree[next] == 0) {q.push(next);}}}return *max_element(dp.begin() + 1, dp.end());}
};

题目4、207. 课程表 - 力扣

image-20250527103226670

这里就是判断是否有环

image-20250527104159624

http://www.lqws.cn/news/70255.html

相关文章:

  • [RoarCTF 2019]Easy Calc
  • 常见ADB指令
  • 数据库系统概论(十六)数据库安全性(安全标准,控制,视图机制,审计与数据加密)
  • JavaScript性能优化
  • [android]MT6835 Android 指令启动MT6631 wifi操作说明
  • 【大模型学习】项目练习:视频文本生成器
  • 【C盘瘦身】给DevEco Studio中HarmonyOSEmulator(鸿蒙模拟器)换个地方,一键移动给C盘瘦身
  • Python发送天气预报到企业微信解决方案
  • 计算机视觉---YOLOv6
  • 函数组件和类组件
  • 【Java EE初阶】计算机是如何⼯作的
  • java28
  • [MySQL初阶]MySQL(7) 表的内外连接
  • 什么是线程上下文切换?
  • Linux(10)——第二个小程序(自制shell)
  • 摩尔投票算法原理实现一文剖析
  • SQL Views(视图)
  • MyBatis源码解析:从 Mapper 接口到 SQL 执行的完整链路
  • 数据库系统概论(十二)SQL 基于派生表的查询 超详细讲解(附带例题表格对比带你一步步掌握)
  • Spring Boot中的WebSocket技术实现
  • oracle sql 语句 优化方法
  • NLP学习路线图(十九):GloVe
  • Spring Boot中保存前端上传的图片
  • Android高级开发第三篇 - JNI异常处理与线程安全编程
  • 使用 PHP 和 Guzzle 对接印度股票数据源API
  • 【Android】MT6835 + MT6631 WiFi进入Meta模式出现WiFi_HQA_OpenAdapter failed
  • 【Elasticsearch】Elasticsearch 核心技术(一):索引
  • 大数据-275 Spark MLib - 基础介绍 机器学习算法 集成学习 随机森铃 Bagging Boosting
  • MySQL数据库从0到1
  • 基于FPGA的VGA显示文字和动态数字基础例程,进而动态显示数据,类似温湿度等