A - 小Y上学记——修学分
A - 小Y上学记——修学分
Problem Description
小Y终于如愿以偿地通过高考来到了魂牵梦萦的大学校园——ACdream大学。来到校园的第一件事就是选课。
由于每一门课都有1个学分~而且有一些课需要先学完别的课程(例如必须先学会高等数学,才能学会量子力学,必须先学会走,才能学会跑)
ACdream大学需要学生修够若干学分才允许毕业。
请按顺序输出小Y的一种方案(若不止一种答案,请输出字典序最小的一种方案)
Input
多组数据,每组数据首先是两个整数n,m,k,分别表示学科总数,学科之间的关系数,以及毕业所需的最少学分。
(2<=n<=100, 0<=m<=500,1<=k<=n)
接下来是m行,每行是两个整数a,b表示学科a是学科b的前置学科。
Output
对于每组数据,若小Y不存在任何方案选课,请输出-1.
否则在一行输出m个整数,表示小Y按顺序修的学科编号。
Sample Input
2 1 2
0 1
2 2 2
1 0
0 1
3 2 1
1 0
0 1
3 0 3
Sample Output
0 1
-1
2
0 1 2
Hint
对于第一组数据,先修完第0学科,获得1学分,再修以第0学科为前置学科的第1学科,获得1学分,即可满足毕业条件:2学分。
对于第二组数据,由于第0学科的前置学科为第1学科,而第1学科的前置学科为第2学科,因此小Y无论如何也无法满足毕业条件。
对于第三组数据,由于多了第2学科,而且第2学科不需要前置学科,因此只需要修完第2学科即可满足毕业条件了。
对于第四组数据,没有任何的先后限制,因此6种全排列方案均符合题意,字典序最小的方案为0,1,2
解法:ToPoSort一下,排序K个即可。
代码:2015.7.30
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <map>
#define MAX 505
using namespace std;
int InD[];/*InD[i]记录点i的入度*/
int First[MAX];/*First[i]头结点的第一条边的编号*/
struct edge
{
int TO;/*点*/
int Next;/*下一条边的编号*/
}ID[*MAX];
int SIGN;
void Add_E(int x,int y)/*添加点操作*/
{
ID[SIGN].TO=y;
InD[y]++;
ID[SIGN].Next=First[x];
First[x]=SIGN++;
}
int Jude(int x,int y)/*查找与X是否与Y相连*/
{
int i;
for(i=First[x];i!=;i=ID[i].Next) //查找与该点相关的点
{
if(ID[i].TO==y)return ;
}
return ;
}
int ToPoSort(int N,int Num[],int K)/*拓扑排序,邻接表*/
{
int i,j,k;
for(j=;j<N;j++)
{
for(i=;i<=N;i++)
{
if(InD[i]==)
{
InD[i]--;
Num[j]=i;
for(k=First[i];k!=;k=ID[k].Next)
{
InD[ID[k].TO]--;
}
break;
}
}
if(i>N)break;
}
if(j>=K)return ;
else return ;
}
int main()
{
int M,N,K,i;
int a,b;
int Num[MAX];
while(scanf("%d%d%d",&N,&M,&K)!=EOF)
{
for(i=;i<=N;i++){First[i]=;InD[i]=;}
for(i=,SIGN=;i<M;i++)
{
scanf("%d%d",&a,&b);a+=;b+=;
Add_E(a,b);
}
if(ToPoSort(N,Num,K))/*拓扑排序*/
{
for(i=;i<K;i++)
{
if(i!=)putchar();
printf("%d",Num[i]-);
}putchar();
}
else printf("-1\n");
}
return ;
}
A - 小Y上学记——修学分的更多相关文章
- D - 小Y上学记——要迟到了!
D - 小Y上学记——要迟到了! Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) ...
- C - 小Y上学记——认识新同学
C - 小Y上学记——认识新同学 Time Limit: 4000/2000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) ...
- B - 小Y上学记——小Y的玩偶
B - 小Y上学记——小Y的玩偶 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) ...
- CCF CSP 201812-1 小明上学
题目链接:http://118.190.20.162/view.page?gpid=T80 问题描述 试题编号: 201812-1 试题名称: 小明上学 时间限制: 1.0s 内存限制: 512.0M ...
- WJC上学记
WJC上学记题目描述:WJC为了追求YHY,决定考上树人,但是,愚蠢的他没有足够好的成绩,只能靠自己的亲戚来帮忙.但是由于他足够愚蠢,连自己的亲戚都不认识,仁慈而被树人优录的Geek_du决定帮助他. ...
- CCF201812-1小明上学
题目背景 小明是汉东省政法大学附属中学的一名学生,他每天都要骑自行车往返于家和学校.为了能尽可能充足地睡眠,他希望能够预计自己上学所需要的时间.他上学需要经过数段道路,相邻两段道路之间设有至多一盏红绿 ...
- 小Y的难题
Font Size:Aa Aa Aa Description 近期小Y迷上了数学,总是在思考各种数学问题.有一天,他不小心把墨水洒在草稿纸上.他如今能看到的是"2?3?1?4"(? ...
- 【luogu P4007 清华集训2017】小Y和恐怖奴隶主
题目背景 “A fight? Count me in!” 要打架了,算我一个. “Everyone, get in here!” 所有人,都过来! 题目描述 小 Y 是一个喜欢玩游戏的 OIer.一天 ...
- 【luoguP4006 清华集训2017】小Y和二叉树
题目描述 小 Y 是一个心灵手巧的 OIer,她有许多二叉树模型. 小 Y 的二叉树模型中,每个结点都具有一个编号,小 Y 把她最喜欢的一个二叉树模型挂在了墙上,树根在最上面,左右子树分别在树根的左下 ...
随机推荐
- C#泛型委托及约束
泛型委托: namespace 泛型委托 { public delegate void Mydelegate<T>(T msg); class Program { static void ...
- linux 文件和目录操作
1 相对路径和绝对路径 (与C++中概念相似) cd /root/cat 绝对路径 cd ../文件名/ 相对路径,指相对某个文件而言的 2 切换目录 cd 当前目录 进入某个目录 pwd 显示当前 ...
- iframe标签使用总结与注意问题
子页面访问父父页面变量,函数,页面元素 //变量: //在父页面中需定义为全局变量 //子页面中调用 var childFrameVar= parent.ParentVarName; //函数: pa ...
- @Autowired注解(转)
5.6.4 @Autowired注解 自Spring诞生以来,
- 忘记linux用户名和密码怎么解决?
开机进入单用户模式,可跳过密码验证修改root密码. 具体步骤如下: 开机读秒时键盘上按回车 通过操纵键盘上下方向键选择系统版本,然后按下E 通过操纵键盘上下方向键选择kernel所在行,再次按下E进 ...
- 打开新世界的第一步:学习servlet
什么是servlet? 是用Java编写的服务器端程序.其主要功能在于交互式地浏览和修改数据,生成动态Web内容. 创建servlet 一.创建一个web project 1)流程:eclipse-F ...
- 网站生产app的一些网址
1.http://www.staticgen.com/2.http://siteapp.baidu.com3.http://www.apicloud.com
- Activity生命周期方法调用finish后的不同表现
今天宿舍一个哥们出去面试遇到了这个面试题:"在activity oncreate()调用finish()"生命周期是怎么样的? 我赶紧写了些demo,发现确实很有趣: packag ...
- java-成员方法/变量、类方法/变量等区别
方法 成员方法 成员方法也叫实例方法.必须先有实例即对象,然后才能通过实例调用该实例方法. 类方法 和类变量一样,有关键字static修饰,可以不用实例,直接用类就可以调用类方法. 变量 成员变量 也 ...
- spring ,mybatis多数据源
同一个项目有时会涉及到多个数据库,也就是多数据源.多数据源又可以分为两种情况: 1)两个或多个数据库没有相关性,各自独立,其实这种可以作为两个项目来开发.比如在游戏开发中一个数据库是平台数据库,其 ...