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

拓扑排序(c++)

拓扑排序:可以对有向图的数据按照先后顺序进行排序,也可以用来检测有向图中有没有环

题目

课程表

题目描述

你这个学期必须选修n门课程,记为0到n-1。在选修某些课程之前需要一些先修课程。给你一个数组p,其中p[i]=[ai,bi]表示如果想选修课程ai,则必须先选修课程bi。m表示数组p中数据个数

例如,想要学习课程0,你需要先完成课程1,我们用一个匹配来表示:[0,1]。

先输入n、m,再输入数组p。
请你判断是否可能完成所有课程的学习?如果可以,返回true;否则,返回false。

样例

输入:

2 2

1 0

0 1

输出

false

解释:课程1需要先学0,课程0又需要先学1,存在循环依赖,不可能完成。

代码

#include <bits/stdc++.h> using namespace std; int a[1010][1010];//邻接矩阵 int c[1010];//入度 int b[1010];//是否被访问 int r[1010];//排序结果 int lr; int n,m; queue<int> q; void bfs(); int main() { cin>>n>>m; for(int i = 0;i<m;i++) { int x,y; cin>>x>>y; a[y][x] = 1;//构建邻接矩阵 c[x]++;//增加入度的数量 } bfs(); if(lr==n) cout<<"true"; else cout<<"false"; return 0; } void bfs() { for(int i = 0;i<n;i++) { if(c[i]==0)//入度等于0 { q.push(i); b[i] = 1;//标记已被访问 r[lr] = i;//排序 lr++; } } while(q.empty()==false) { int head = q.front(); q.pop(); for(int i = 0;i<n;i++) { if(a[head][i]==1&&b[i]==0) { c[i]--; if(c[i]==0) { q.push(i); b[i] = 1;//标记已被访问 r[lr] = i;//排序 lr++; } } } } }

课程表二

题目描述

现在你总共有n门课,编号为0到n-1。给你一个数组p,其中p[i=[ai,bi表示如果你想选修课程ai,则必须先完成课程bi。例如,[0,1]表示要选修课程0,必须先选修课程1。返回一种修完所有课程的顺序(可能存在多种有效顺序,你只需要返回其中一种)。如果不可能完成所有课程,返回一个空数组。m表示数组p中数据个数。

先输入n、m,再输入数组p。

样例

输入

4 4

1 0

2 0

3 1

3 2

输出

0 1 2 3

(0 2 1 3 也可以)

代码

#include <bits/stdc++.h> using namespace std; int a[1010][1010];//邻接矩阵 int c[1010];//入度 int b[1010];//是否被访问 int r[1010];//排序结果 int lr; int n,m; queue<int> q; void bfs(); int main() { cin>>n>>m; for(int i = 0;i<m;i++) { int x,y; cin>>x>>y; a[y][x] = 1;//构建邻接矩阵 c[x]++;//增加入度的数量 } bfs(); if(lr==n) { for(int i = 0;i<lr;i++) { cout<<r[i]<<" "; } } else { cout<<0; } return 0; } void bfs() { for(int i = 0;i<n;i++) { if(c[i]==0)//入度等于0 { q.push(i); b[i] = 1;//标记已被访问 r[lr] = i;//排序 lr++; } } while(q.empty()==false) { int head = q.front(); q.pop(); for(int i = 0;i<n;i++) { if(a[head][i]==1&&b[i]==0) { c[i]--; if(c[i]==0) { q.push(i); b[i] = 1;//标记已被访问 r[lr] = i;//排序 lr++; } } } } }
http://www.gsyq.cn/news/1427628.html

相关文章:

  • 50美元DIY房间声学校正器:用树莓派Pico和REW优化听音环境
  • 如何高效使用COM3D2.MaidFiddler:终极COM3D2角色编辑器完整指南
  • Word转PDF的方法有哪些?2026保姆级教程,含官方方法一看就会
  • CNC雕刻与VCarve Pro实战:将三维地形数据转化为木质景观时钟
  • AI代理从演示到生产:跨越复合错误率与可靠性鸿沟的实战指南
  • 推拉力测试机操作教程:从零基础到熟练测试,一文搞定硬件安装+软件设定+校准
  • Python学习第53天:前后端分离开发入门
  • Python异步编程高级模式:asyncio事件循环与并发控制
  • 从零自制简易直流电机:深入理解电磁原理与动手实践
  • 抖音短视频无水印下载技术解析:从网页解析到桌面应用的完整实现方案
  • QMCDecode:QQ音乐加密格式转换方案实现指南
  • 硬核盘点!2026AI论文写作工具大盘点(覆盖 99% 毕业论文需求)
  • CPAL脚本避坑指南:TestcaseFail和TestCaseSkipped用不对,小心你的测试结果全乱套
  • 基于ESP32-C3与太阳能供电的物联网植物监测系统全解析
  • 量子计算硬件基准测试:原理、指标与实践指南
  • 用导电材料与微控制器打造地面互动版西蒙游戏:从电路原理到Scratch编程实践
  • C语言数组10秒搞懂!从原理到代码,新手一看就会
  • 机器人舵机供电方案:多路可调电源设计与避坑指南
  • GTA5线上小助手:新手也能轻松上手的洛圣都全能工具箱
  • 2026郑州吉修匠专注厨卫阳台屋顶漏水,免砸砖一站式防水修缮 - 吉修匠
  • 基于Arduino与MQ-35传感器搭建桌面空气质量监测站
  • 5步搭建个人游戏串流服务器:Sunshine跨平台串流终极指南
  • 测试新手也能玩转:手把手教你用龙测AI-TestOps搞定银行App的登录支付测试
  • 基于Arduino与SIM900的GSM短信温湿度监控系统实战指南
  • 现代 AI 系统技术全景图:从硅片到智能应用的完整价值链
  • 阴阳师自动化脚本:解放双手的智能游戏助手,3步开启高效挂机体验
  • 如何快速提取Godot游戏资源:终极PCK解包工具指南
  • 从零搭建低成本机器人平台:Arduino/ESP32与L298N电机驱动实战
  • 如何用SMUDebugTool解锁AMD Ryzen终极性能:10个硬件调校技巧
  • Pan-Baidu-Download技术方案:命令行环境下的百度网盘高速下载解决方案