当前位置: 首页 > 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

相关文章:

  • 【多线程初阶】内存可见性问题 volatile
  • 电子电路:4017计数器工作原理解析
  • Arbitrum Stylus 合约实战 :Rust 实现 ERC721
  • 【DBA】MySQL经典250题,改自OCP英文题库中文版(2025完整版)
  • 【LLM vs Agent】从语言模型到智能体,人工智能迈出的关键一步
  • 《深入解析SPI协议及其FPGA高效实现》-- 第二篇:SPI控制器FPGA架构设计
  • Kafka集成Flume/Spark/Flink(大数据)/SpringBoot
  • Flink CDC将MySQL数据同步到数据湖
  • 结构型设计模式之装饰模式
  • TDengine 高级功能——读缓存
  • 3,信号与槽机制
  • React 18新特性介绍
  • [ Qt ] | 与系统相关的操作(一):鼠标相关事件
  • LangGraph framework
  • FFmpeg移植教程(linux平台)
  • Webpack依赖
  • 【git-首次初始化本地项目、关联远程仓库】
  • 基于Qt的app开发的过渡期
  • 数据库系统概论(十六)数据库安全性(安全标准,控制,视图机制,审计与数据加密)
  • Linux运维笔记:服务器感染 netools 病毒案例
  • 自己 做网站学什么 平面设计/咸阳seo公司
  • 网站海外推广谷歌seo方案/做网络推广费用
  • 免费的tickle网站/郑州seo排名第一
  • 呢图网站党风廉政建设/百度优化师
  • 做网站软件大全/青岛谷歌优化
  • 明月 WordPress/网站优化方案设计