【拓扑习题】课程安排问题

时间限制:1 s  内存限制:128 MB

【问题描述】

一个软件专业的学生必须学习一 系列基本课程,其中有些课程是基础课,它独立于其它课程,如《高等数学》、《计算引论》;而另一些课程必须在学完作为它的基础的先修课程才能开始。如,在 《程序设计基础》和《离散数学》学完之前就不能开始学习《数据结构》。这些先决条件定义了课程之间的领先(优先)关系。请你在符合上述领先(优先)条件的 前提下,给出所有课程的一个有序序列,以方便学校排课。

【输入格式】

输入文件有若干行
第一行,一个整数n,表示共有n(0<n<=100)门课程
第2--n+1行分别表示第1--n门课程的先修课程信息,每行有若干个整数m,s1,s2,...,sm
m表示该门课程有m门先修课程,s1,s2,...,sm分别表示m门先修课的编号,如果该门课没有先修课程,则m为0。

【输出格式】

一行,n个整数,表示n门课程编号的有序序列(如果这样的序列不存在,则输出no;如果有多个这样的序列,输出字典序最小的)

【输入输出样例】

输入文件名: curriculum.in

4
0
1 1
1 1
2 2 3

输出文件名:curriculum.out

1 2 3 4

【分析】
 这应该也算是经典习题了吧。。这里就当是恢复状态→_→
首先这是个很明显的topo sort,但由于题目丧心病狂地要求最小字典序,这里不得不把算导上介绍的DFS换成基于最小堆的层次遍历算法……OMG,堆的代码之前已经练过了,那么这里就用STL水过去吧。

1 #include <cstdio>
 2 #include <fstream>
 3 #include <queue> //priority_heap
 4 #include <vector> 
 5 #include <functional> //use of FUNCTOR "greater<int>"
 6 using namespace std;
 7 ifstream in("curriculum.in");
 8 ofstream out("curriculum.out");
 9 bool settled[102]={0};
10 int M[102]={0};
11 int N;
12 int ans[102], last = 0;
13 vector <int> Next[102];
14 priority_queue <int, vector<int>, greater<int> >Q;
15 void init()
16 {
17     int i, j, k;
18     for(i = 1;i <=N; ++i)
19     {
20         in >> M[i];
21         if(!M[i]) //Roots
22             Q.push(i);
23         else for(j = 0;j < M[i];++j)
24         {
25             in >> k;
26             Next[k].push_back(i);
27         }
28     }
29 }
30 void Topo()
31 {
32     int k;
33     vector <int>::iterator it;
34     while(!Q.empty())
35     {
36         k = Q.top();Q.pop();
37         ans[last++] = k;
38         settled[k] = 1;
39         for(it = Next[k].begin();it!=Next[k].end();++it)
40         {
41             if(!settled[*it])
42             {
43                 M[*it]--;
44                 if(!M[*it])Q.push(*it);
45             }
46             else return;//ring
47         }
48     }
49 }
50 int main()
51 {
52     int i;
53     ios::sync_with_stdio(0);
54     in >> N;
55     init();
56     Topo();
57     if(last != N)
58         out << "no";
59     else for(i = 0;i < N; ++i)
60         out << ans[i] << ‘ ‘;
61     return 0;
62 }

【拓扑习题】课程安排问题

时间: 2024-10-12 18:50:29

【拓扑习题】课程安排问题的相关文章

1.1课程安排和网站基础知识

/本节视频和图例请看百度云:http://pan.baidu.com/s/1o7bg5a6/ WAMP独立安装 1课程介绍+网站基础知识(HTML+网站+访问流程) 2PHP介绍+web介绍+环境介绍 3Apache安装+配置修改+命令使用 4Apache工作原理+安装PHP+Apache加载PHP 5安装mysql 6php加载mysql+虚拟主机 课程安排 7天:PHP基础知识介绍+服务器搭建 5+1天:5天介绍SQL,1天PHP+mysql编程 12天:PHP深入(面向对象,项目,MVC,

中科院 2014年GCT考前辅导课程安排

: 2014年GCT考前辅导课程安排 发布时间: 2014-07-14 阅读次数:1225                       默认字体                   9pt                   10pt                   11pt                   12pt                   13pt                   14pt                   15pt                  

01Mybatis_课程安排

课程安排: mybatis和springmvc通过订单商品 案例驱动 第一天:基础知识(重点,内容量多) 对原生态jdbc程序(单独使用jdbc开发)问题总结 mybatis框架原理   (掌握) mybatis入门程序 用户的增.删.改.查 mybatis开发dao两种方法: 原始dao开发方法(程序需要编写dao接口和dao实现类)(掌握) mybaits的mapper接口(相当于dao接口)代理开发方法(掌握) mybatis配置文件SqlMapConfig.xml mybatis核心:

[LeetCode] 210. Course Schedule II 课程安排II

There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1] Given the total number of courses and a l

48.Course Schedule(课程安排)

Level: ??Medium 题目描述: There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1] Given the total numbe

java某课程安排

课程 课程内容 课程目标 第一阶段(以Tetris项目贯穿) Java语言基础 算法基础.常用数据结构.企业编程规范. 掌握常见的数据结构和实用算法:培养良好的企业级编程习惯. Java面向对象 面向对象特性:封装.继承.多态等,面向对象程序设计,基础设计模式等. 掌握面向对象的基本原则以及在编程实践中的意义:掌握Java面向对象编程基本实现原理. 实训项目一:Tetris项目开发 第二阶段(以T-DMS V1项目贯穿) JDK核心API 语言核心包.异常处理.常用工具包.集合框架. 熟练掌握J

《对象程序设计》课程 课程设计、考试安排 及 教师建议

通知 (1)课程设计时间 第18周周一-周五上午,软件一室.(有兴趣的同学下午也可以在里面,电脑很多,下午是网络131班课程设计时间) 课程设计题目,老师将于下周(16周)发给大家(公布在CSDN博客 及 通知学委黎文),请大家提前准备. (2)考试时间 第18周周三下午(计划),请大家好好复习,开卷考试,主要考察大家对基础的掌握程度.杜绝作弊(老师从这个学期开始会严抓考试纪律,发现第一个作弊的同学将没收考卷,第二个报送到教务处,请大家理解). (3)老师工作时间 老师已经在湛江,除短暂外出学习

Llinux课程计划安排

1.学习计划 时间安排 6:30起 10:30睡死后必定长眠,生前何必多睡,其它吃饭洗衣服不得不做的事外都要用来学习. 2.学习态度 遇到问题找方法,不要找借口:掰开了揉碎了好好学习打好基础,后起之秀很容易撵上,要有如履薄冰战战兢兢的心态:工作中运用最多的是基础知识 无本之木无源之水 高级的东西才有建立的基本 :学习的不只是知识是思维方式学习的方法做事的方式. 3.基础篇 鸟哥的私房菜 推荐 4.作业 笔记整理在51cto上(面试的时候讲不清楚会在多也没用)整理知识删繁就简 总结博客总分总形式

Vipkid是什么课程?具体课程是如何安排的?

如今的家长对于还真的教育都非常的重视,而学好英语依然成为家长们对孩子们的基本要求.所以很多家长从小给孩子报英语班.说道少儿英语班最近家长们讨论比较多的就是vipkid少儿英语了,vipkid作为刘涛代言的在线少儿英语品牌,广告一直是刷屏式的推广.随着vipkid广告铺天盖地的推广,vipkid的名气也越来越大,但是很多的家长对于vipkid还是很不了解的,Vipkid是什么课程?具体课程是如何安排的?下面我来为大家简单介绍一下vipkid. Vipkid少儿英语是一家在线少儿英语教育平台,是通过