#SLT08C. 2026年S组模拟赛10连测第8场-T3 程老师的课程链
2026年S组模拟赛10连测第8场-T3 程老师的课程链
| 项目 | 内容 |
|---|---|
| 输入文件名 | scc.in |
| 输出文件名 | scc.out |
| 可执行文件名 | scc |
| 每个测试点时限 | 1.0 秒 |
| 内存限制 | 512 MiB |
| 测试点数目 | 20 |
| 是否等分 | 是 |
结果比较方式为全文比较(过滤行末空格及文末换行)。
题目描述
程老师要给一批学员开设 门课程,课程按 编号。排课时他发现,这些课程之间存在 条先修关系:每条先修关系是一对课程 ,含义是"课程 必须先修完,课程 才能开始修"。同一门课不会要求自己先修——没有一条先修关系是自己指向自己的;而两门课之间可以同时存在两个方向的先修关系,也就是既要求 先于 、又要求 先于 。
把先修关系接起来推:如果已经推出" 先于 ",又有一条先修关系说" 先于 ",那就同样要求 先于 ;推出来的先后要求可以继续参与推导,中途经过哪些课程不限。如果按这套推法,既能推出"课程 先于课程 "、又能推出"课程 先于课程 ",就称 与 互为先修。程老师的处理办法是:把两两互为先修的一批课程捆成一个班组,班组内的课程必须同时开修、同时修完——这批课互相要求对方在先,只有同时上才排得开。
排课按时段进行。每个时段开始时,程老师可以同时安排任意多个班组、任意多门不属于任何班组的课开课:一个班组或一门课能否排在某个时段,只看它所需的全部先修课程是否都已在更早的时段里修完;同一时段内排在一起的那些班组与课之间,没有先后要求,也不需要彼此之间有任何关系。班组一旦开出,其中所有课程都在同一个时段里修完、不跨时段;不属于任何班组的课不与其他课程捆绑,但同样可以与其他班组、其他课共用同一个时段。现在程老师想知道:把全部课程修完,最少需要几个时段。
输入格式
从文件 scc.in 中读入数据。
第一行两个整数 ,表示课程门数与先修关系条数。
接下来 行,每行两个整数 ,表示一条"课程 必须先于课程 "的先修关系。若 ,则没有这一部分。
输出格式
输出到文件 scc.out 中。
输出一行一个整数,表示修完全部课程最少需要的时段数。
样例
4 4
1 2
2 3
3 1
3 4
2
样例 1 解释
先沿着先修关系推一遍。课程 要求课程 先修完;反过来,把" 先于 "接上" 先于 ",又推出" 先于 "。这一对课程两边都要求对方在先,互为先修。同样地,课程 与 也互为先修—— 顺着" 先于 "" 先于 "推出先于 ;课程 与 也互为先修—— 顺着" 先于 "" 先于 "推出先于 ,而" 先于 "本来就有。三门课两两互为先修,只能同时开修、同时修完,捆成一个班组,占一个时段。课程 要求课程 先修完,只能排在这个班组之后的下一个时段。
为什么不能更少:课程 不能与班组排在同一个时段(它要求班组里的课程先修完),而班组又不能拆到两个时段(捆在一起的课程必须同时修完),所以 个时段做不到;上面的排法恰好用 个时段。
3 2
1 2
2 3
3
样例 2 解释
三门课里没有任何一对互为先修:课程 与 之间只有" 先于 "这一个方向的要求;课程 与 之间只有" 先于 ";课程 与 之间能推出" 先于 ",却推不出" 先于 "。三门课都不属于任何班组,各自单独开课。
再看时段。课程 要求课程 先修完,课程 要求课程 先修完:它们的先修课程都没有提前修完,谁也不能和谁挤在同一个时段里,只能在时间上一门接一门,所以三个时段都要占用。
数据范围
对于所有测试数据,保证:
- ,;
- 每条先修关系 ,且 ;
- 没有一条先修关系是自己指向自己的;
- 同两门课程之间可以同时存在两个方向的先修关系。
各测试点的约束如下:
| 测试点 | 特殊性质 | ||
|---|---|---|---|
| 无 | |||
| A | |||
| B |
- 特殊性质 A:没有任何先修关系,即 。
- 特殊性质 B:把课程按 编号后,恰好有 条先修关系,且对每个 ,这 条先修关系中恰好有一条是"课程 必须先于课程 "。
- ID
- 3799
- 类型
- 传统题
- Time Limit
- 1000ms
- Memory Limit
- 512MiB
- 上传者