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

题解:AtCoder AT_awc0028_d Course Enrollment Order

【题目来源】

AtCoder:D - Course Enrollment Order

【题目描述】

Takahashi is trying to take all \(N\) courses at his university.
高桥正在尝试修读他大学的所有 \(N\) 门课程。

The courses are numbered from \(1\) to \(N\), and each course is taken exactly once. Some courses have prerequisite courses, and in order to take such a course, all of its prerequisite courses must have been completed beforehand. A single course may have multiple prerequisites. Courses with no prerequisites can be taken from the beginning.
课程编号从 \(1\)\(N\),每门课程恰好修读一次。有些课程有先修课程,为了修读这样的课程,其所有先修课程必须已经完成。一门课程可能有多个先修课程。没有先修课程的课程可以从一开始就修读。

There are \(M\) prerequisite relationships given, each in the form: "In order to take course \(B_j\), course \(A_j\) must have been completed first."
给出了 \(M\) 个先修关系,每个关系形式如下:"为了修读课程 \(B_j\),必须先完成课程 \(A_j\)。"

Takahashi takes courses one at a time. At each step, among the courses he has not yet taken whose prerequisites have all been completed (these are called available courses), he selects the one with the smallest number and takes it.
高桥一次修读一门课程。在每一步,在所有尚未修读且其先修课程已全部完成的课程中(这些课程称为可选课程),他选择编号最小的那一门进行修读。

Output the order in which Takahashi takes all the courses.
输出高桥修读所有课程的顺序。

It is guaranteed that there are no contradictions in the prerequisite relationships (i.e., no cycles exist), and that it is always possible to take all courses. Furthermore, the above rule uniquely determines the order of enrollment.
保证先修关系中没有矛盾(即不存在循环),并且始终可以修完所有课程。此外,上述规则唯一确定了选课顺序

【输入】

\(N\) \(M\)
\(A_1\) \(B_1\)
\(A_2\) \(B_2\)
\(\vdots\)
\(A_M\) \(B_M\)

  • The first line contains an integer \(N\) representing the number of courses and an integer \(M\) representing the number of prerequisite relationships, separated by a space.
  • The \(j\)-th of the following \(M\) lines \((1 \leq j \leq M)\) contains integers \(A_j\) and \(B_j\) separated by a space, indicating that course \(A_j\) must be completed before taking course \(B_j\).

【输出】

Output the order in which Takahashi takes the courses on a single line, separated by spaces. That is, output \(N\) integers arranged from left to right in the order they are taken.

【输入样例】

4 3
1 2
3 4
2 4

【输出样例】

1 2 3 4

【核心思想】

  1. 问题分析:给定有向无环图(DAG),需要输出一个拓扑序列,使得序列的字典序最小。普通队列实现的拓扑排序只能保证得到一个合法序列,但无法保证字典序最小。

  2. 算法选择

    • Kahn算法:基于入度的拓扑排序算法
    • 优先队列(最小堆):每次从入度为 \(0\) 的节点中选择编号最小的,保证字典序
  3. 关键步骤

    • 初始化入度数组 \(in[v]\) 和邻接表
    • 将所有入度为 \(0\) 的节点加入优先队列(最小堆)
    • 循环取出队首最小元素 \(u\),加入拓扑序列
    • 遍历该节点的所有出边,减少邻接点 \(v\) 的入度 \(in[v]\)
    • 若邻接点入度变为 \(0\),加入优先队列
    • 最终输出拓扑序列
  4. 时间/空间复杂度

    • 时间复杂度:\(O((N + M) \log N)\),每个节点和边处理一次,优先队列操作 \(O(\log N)\)
    • 空间复杂度:\(O(N + M)\),邻接表、入度数组和队列
  5. 字典序拓扑排序的核心思想

    • 普通队列:先进先出,拓扑序列不唯一
    • 优先队列:每次选择最小可用节点,保证字典序最小
    • 适用于需要最小/最大字典序拓扑序列的场景

【算法标签】

拓扑排序

【代码详解】

#include <bits/stdc++.h>
using namespace std;
const int N = 200005, M = 200005;int n, m;
// 优先队列(最小堆),用于实现字典序最小的拓扑排序
priority_queue<int, vector<int>, greater<int> > q;
// 存储拓扑排序的序列
vector<int> seq;
// 入度数组
int ind[N];
// 邻接表(数组模拟链表)
int h[N], e[M], ne[M], idx;// 添加有向边 a -> b
void add(int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}int main()
{cin >> n >> m;// 初始化邻接表头指针memset(h, -1, sizeof(h));for (int i = 1; i <= m; i++){int a, b;cin >> a >> b;add(a, b);// 增加终点 b 的入度ind[b]++;}// 将所有入度为 0 的顶点加入优先队列for (int i = 1; i <= n; i++){if (ind[i] == 0){q.push(i);}}while (!q.empty()){// 取出当前编号最小的入度为 0 的顶点int u = q.top();q.pop();// 将该顶点加入拓扑序列seq.push_back(u);// 遍历顶点 u 的所有出边for (int i = h[u]; i != -1; i = ne[i]){int j = e[i];// 减少后继顶点的入度ind[j]--;// 如果入度变为 0,则加入优先队列if (ind[j] == 0){q.push(j);}}}// 输出拓扑排序的结果for (int i = 0; i < seq.size(); i++){cout << seq[i] << " ";}cout << endl;return 0;
}

【运行结果】

4 3
1 2
3 4
2 4
1 2 3 4
http://www.rkmt.cn/news/1523133.html

相关文章:

  • Mythos:首个可规模化漏洞挖掘的AI安全智能体
  • 2026邯郸本地水质检测饮用水检测哪家强?TOP 正规机构榜单 + 联系方式 - 中安检测集团
  • 2026怀化厂区电能质量测试评估放心机构 TOP + 实地测评 + 详细地址电话 - 中检检测集团
  • 2026年陕西地区技工院校权威观察:新纪元如何构建“教学-实训-就业”闭环生态 - 品研笔录
  • CVPR、ICCV、ECCV三大顶会到底怎么选?给计算机视觉研究新手的投稿全攻略
  • TranslucentTB终极教程:如何快速解决Windows任务栏透明化工具的VCLibs依赖问题
  • 2026太阳能路灯实力厂家:市政/农村/景区/庭院/小区路灯,匠心品质与亮化工程优选 - 品牌发掘
  • 2026贵州厂区电能质量测试评估放心机构 TOP + 实地测评 + 详细地址电话 - 中检检测集团
  • 别再看官方文档了!手把手教你为SuperMap GIS项目选对国产服务器和CPU(附避坑清单)
  • 2026济南本地水质检测饮用水检测哪家强?TOP 正规机构榜单 + 联系方式 - 中安检测集团
  • 别再到处找靶场了!Vulnhub、HackTheBox、Vulhub... 这8个主流渗透测试靶场怎么选?
  • 别急着买新款!聊聊Garmin fēnix 7X Pro的‘小睡检测’和‘光线感应器’到底值不值那1500块差价
  • 题解:AtCoder AT_awc0031_e Power Grid Blackout Crisis
  • 围棋AI分析利器:LizzieYzy快速上手指南
  • Blender 3MF插件:如何在Blender中实现3D打印模型的完整导入导出
  • MobaXterm vs Xshell:手把手教你为堡垒机后的服务器配置SSH代理(含原理图解)
  • 2026资阳大众首选贵金属回收商户名录 TOP 金条、铂金、白银线下回收门店信息一览 - 中业金奢再生回收中心
  • (干货整理)实测好用的AI写作辅助软件,毕业党收藏备用
  • 2026年精选AI论文平台榜单(实测甄选版)
  • LLM结构化输出工程实践:Prompt、Parser与Tool三层防御体系
  • 2026年6月分体式电磁流量计知名品牌排行榜:国产力量重塑市场格局下的理性选型指南 - 液体流量液位品牌推荐
  • 基于plc的矿井排水泵站监控系统设计1324(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 2026重庆大众首选贵金属回收商户名录 TOP 金条、铂金、白银线下回收门店信息一览 - 中业金奢再生回收中心
  • 终极游戏性能优化指南:如何用sguard_limit控制腾讯游戏资源占用
  • 2026年淮南中考200-300分能上什么公办学校?热门专业与报名方式 - 小张zc
  • 2026长春大众首选贵金属回收商户名录 TOP 金条、铂金、白银线下回收门店信息一览 - 中业金奢再生回收中心
  • 2026年 苏州茶叶门店推荐榜:姑苏区茶室、礼品茶与实体店精选口碑之选 - 品牌发掘
  • 大学生暑假别再卖力气了!寒假逆袭,靠这3个技能比打零工赚得多
  • AI面试系统原理与技术实现解析
  • 【郴州同城黄金回收服务 | 鑫盛 鑫诚 万金汇黄金回收】 - 润富黄金回收