当前位置: 首页 > 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.cnnetsun.cn/news/2656518.html

相关文章:

  • 从可变电阻调光电路入门:欧姆定律实践与非线性负载探究
  • Translumo:简单快速的免费屏幕实时翻译工具终极指南
  • 为什么你的Claude总在长文档中“断片”?3步Prompt重构法+2个隐藏system指令立竿见影
  • Python学习第52天:中间件的应用
  • ELF技术:机器学习加速逻辑综合的工程实践
  • 量子计算硬件基准测试:原理、指标与实践指南
  • STM32 uPSD3xxx代码分区:BL51到LX51迁移实战指南
  • AI Agent Harness Engineering 养老领域应用:健康监测、生活辅助与情感陪伴
  • 终极指南:5步实现Figma到AE的无缝设计转换
  • 终极指南:用QMCDecode一键解锁QQ音乐加密文件,实现音乐自由
  • 别再让电机乱转了!用STM32的TIM3和ULN2003A实现精准PWM调速(附完整CubeMX配置)
  • Git 常用命令行开发测试速查
  • AI装机实战:如何用ChatGPT精准挑选显卡,解决游戏与生产力需求
  • Python collections.Counter 超详细讲解
  • TShit.cs和Star.cs
  • 保姆级教程:在Linux服务器上配置PCIe AER,让你的系统错误无处遁形
  • 【AI工具订阅费用优化黄金法则】:20年IT架构师亲授7大降本策略,立省40%+年度支出
  • 别再一上来就让 AI 开工:先让它“拷问”你,返工真的会少很多
  • 《星辰变归来》:官方下载解锁新玩法,6.4公测打破修仙刻板印象
  • Ai2Psd:专业矢量设计工作流的关键桥梁工具
  • 2026年5月电磁流量计厂家十大品牌口碑盘点——选型推荐看这里!
  • 别再乱找激活工具了!手把手教你用记事本写一个自己的Win10 KMS激活脚本(.bat文件)
  • code-workspace是什么?
  • 硬核盘点!2026AI论文写作工具大盘点(覆盖 99% 毕业论文需求)
  • AI写教材新玩法,低查重工具助力,快速打造精品教材!
  • 别再只会用unittest了!用Pytest+Requests给你的接口测试升个级(附完整插件清单)
  • 开源项目吐槽大会:深度体验JVS低代码框架,该夸的夸,该骂的骂
  • AI专著生成秘籍大公开!4款AI工具助力,快速完成20万字专著写作!
  • 终极罗技鼠标压枪宏配置指南:3步实现PUBG职业级压枪效果
  • 如何高效下载文档:kill-doc工具终极使用指南