Gym - 102307G Graduation 拓扑排序
Gym - 102307G Graduation
题意:xjl得修够n门课才能毕业,其中有些课是某门课的先行课,并且他精力有限,每学期最多只能修k门课,问xjl最少需要多少学期才能毕业。
首先,正向的图是n对1的,一个点会受到多个点的限制,所以反向建图,这样每去掉一个点,所释放的点都是没有限制的。
解法一:我们以原图中没有入度的点作为深度1,这样新图中没有人度的点就是最高深度,那么如果可以当前选择的点少于等于k个,直接便是取完这些点
那么当多于k个时,根据我们反向的原理自然是让深度高的选取。
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int N=1e4+;
struct Node{
int id,dep;
Node(){}
Node(int id,int dep):id(id),dep(dep){}
bool operator<(const Node& n1)const{
return dep<n1.dep;
}
};
int n,k,ne[N],ra[N];
vector<int> vv[N];
void dfs(int u){
if(vv[u].size()==){
ra[u]=;
return ;
}
for(int i=;i<(int)vv[u].size();i++){
dfs(vv[u][i]);
ra[u]=max(ra[u],ra[vv[u][i]]+);
}
}
int tp(){
queue<int> q;
priority_queue<Node> qq;
for(int i=;i<=n;i++) if(!ne[i]) qq.push(Node(i,ra[i]));
int ans=,cnt=,u,v;
while(!qq.empty()){
ans++;
cnt=;
while(!qq.empty()&&cnt<k){
cnt++;
q.push(qq.top().id);
qq.pop();
}
while(!q.empty()){
u=q.front();
q.pop();
for(int i=;(int)i<vv[u].size();i++){
v=vv[u][i];
qq.push(Node(v,ra[v]));
}
}
}
return ans;
}
int main(){
while(~scanf("%d%d",&n,&k)){
for(int i=;i<=n;i++) vv[i].clear();
for(int i=;i<=n;i++){
scanf("%d",&ne[i]);
if(!ne[i]) continue;
vv[ne[i]].push_back(i);
}
for(int i=;i<=n;i++) if(!ne[i]) dfs(i);
printf("%d\n",tp());
}
return ;
}
nlogn
解法二:每门课的最快能学的学期就取决于它的深度,当某个课被提前学到了 就说明在它的之前可选择的课少于k个,此时直接让那些课便作为一层。
include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int N=1e4+;
int n,k,in[N],ne[N],ra[N];
vector<int> vv[N];
int tp(){
queue<int> q;
for(int i=;i<=n;i++) if(!in[i]){
ra[i]=;
q.push(i);
}
int ans=,cnt=,u,v;
while(!q.empty()){
u=q.front();
q.pop();
cnt++;
if(cnt==) ans++;
if(cnt==k) cnt=;
if(ra[u]>ans) ans++,cnt=;
for(int i=;i<(int)vv[u].size();i++){
v=vv[u][i];
ra[v]=max(ra[v],ra[u]+);
in[v]--;
if(!in[v]) q.push(v);
}
}
return ans;
}
int main(){
while(~scanf("%d%d",&n,&k)){
for(int i=;i<=n;i++){
in[i]=ra[i]=;
vv[i].clear();
}
for(int i=;i<=n;i++){
scanf("%d",&ne[i]);
if(!ne[i]) continue;
in[i]++;
vv[ne[i]].push_back(i);
}
printf("%d\n",tp());
}
return ;
}
/*
4 2
4 4 4 0
*/
n
Gym - 102307G Graduation 拓扑排序的更多相关文章
- hdu-5695 Gym Class(贪心+拓扑排序)
题目链接: Gym Class Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 2016 百度之星初赛 Gym Class(优先队列+拓扑排序)
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Pract ...
- HDU - 5695 Gym Class 【拓扑排序】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5695 思路 给定一些关系 进行拓扑排序 但是有一个要求 对于哪些没有确切的位置的点 要按照ID大小 I ...
- Gym Class(拓扑排序)
Gym Class Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- 题解报告:hdu 5695 Gym Class(拓扑排序)
题目链接:acm.hdu.edu.cn/showproblem.php?pid=5695 Problem Description 众所周知,度度熊喜欢各类体育活动.今天,它终于当上了梦寐以求的体育课老 ...
- 2016"百度之星" - 初赛(Astar Round2A)Gym Class(拓扑排序)
Gym Class Accepts: 849 Submissions: 4247 Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65 ...
- HDU 5695 ——Gym Class——————【贪心思想,拓扑排序】
Gym Class Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- 【拓扑排序】【线段树】Gym - 101102K - Topological Sort
Consider a directed graph G of N nodes and all edges (u→v) such that u < v. It is clear that this ...
- 【DFS】【拓扑排序】【动态规划】Gym - 100642A - Babs' Box Boutique
给你10个箱子,有长宽高,每个箱子你可以决定哪个面朝上摆.把它们摞在一起,边必须平行,上面的不能突出来,问你最多摆几个箱子. 3^10枚举箱子用哪个面.然后按长为第一关键字,宽为第二关键字,从大到小排 ...
随机推荐
- SCALA基础知识学习
注:本文只说和Java不同的地方. 总结自: Scala详细教程 Scala教程 scala基础语法 Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ";" 是 ...
- react以组件为中心的代码分割和懒加载
背景 随着项目越来越复杂,功能够越来越多,JS单个文件就会比较臃肿,js代码拆分显得必不可少. Js文件拆分主要分为按照路由进行js拆分.按照组件进行js拆分. 按照路由拆分:因为本项目请求路径得原因 ...
- (二十一)JSP基础
定义 JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写html,但它相 ...
- (六)在线文档编辑器的使用和数据字典(ueditor编辑器/my97datepicker日期控件)
使用ueditor编辑器注意: 1. 要把ueditor的jar包添加到WEB-INF/lib里. 2. 在做图片上传等功能时,必须重写struts的过滤器,否则图片流会被拦截程序无法得到图片. 3. ...
- kafka之基本介绍
什么是kafka? Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理 ...
- 在论坛中出现的比较难的sql问题:8(递归问题 树形结构分组)
原文:在论坛中出现的比较难的sql问题:8(递归问题 树形结构分组) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必 ...
- mac安装composer
推荐阅读:https://www.jianshu.com/p/edde14a67b1a 自己实际操作: 下载 composer https://getcomposer.org/download/ 下载 ...
- springboot启动流程(七)ioc容器refresh过程(上篇)
所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 正文 在前面的几篇文章中,我们看到Environment创建.application配置文件的 ...
- 【转载】salesforce 零基础开发入门学习(五)异步进程介绍与数据批处理Batchable
salesforce 零基础开发入门学习(五)异步进程介绍与数据批处理Batchable 本篇知识参考:https://developer.salesforce.com/trailhead/for ...
- 什么是DDOS
什么是DDOS?分布式拒绝服务攻击(Distributed Denial of Service).百度的解释有一个形象的例子我认为比较好理解,照搬如下: 一群恶霸试图让对面那家有着竞争关系的商铺无 ...