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 拓扑排序的更多相关文章

  1. hdu-5695 Gym Class(贪心+拓扑排序)

    题目链接: Gym Class Time Limit: 6000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) ...

  2. 2016 百度之星初赛 Gym Class(优先队列+拓扑排序)

    Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Pract ...

  3. HDU - 5695 Gym Class 【拓扑排序】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5695 思路 给定一些关系 进行拓扑排序 但是有一个要求 对于哪些没有确切的位置的点 要按照ID大小 I ...

  4. Gym Class(拓扑排序)

    Gym Class Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  5. 题解报告:hdu 5695 Gym Class(拓扑排序)

    题目链接:acm.hdu.edu.cn/showproblem.php?pid=5695 Problem Description 众所周知,度度熊喜欢各类体育活动.今天,它终于当上了梦寐以求的体育课老 ...

  6. 2016"百度之星" - 初赛(Astar Round2A)Gym Class(拓扑排序)

    Gym Class  Accepts: 849  Submissions: 4247  Time Limit: 6000/1000 MS (Java/Others)  Memory Limit: 65 ...

  7. HDU 5695 ——Gym Class——————【贪心思想,拓扑排序】

    Gym Class Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  8. 【拓扑排序】【线段树】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 ...

  9. 【DFS】【拓扑排序】【动态规划】Gym - 100642A - Babs' Box Boutique

    给你10个箱子,有长宽高,每个箱子你可以决定哪个面朝上摆.把它们摞在一起,边必须平行,上面的不能突出来,问你最多摆几个箱子. 3^10枚举箱子用哪个面.然后按长为第一关键字,宽为第二关键字,从大到小排 ...

随机推荐

  1. 【规律】Cunning Friends

    Cunning Friends 题目描述 Anthony and his friends Ben and Chris decided to play a game. They have N piles ...

  2. Scratch2.0教材(9)——合体大变身

    教材说明 ——————— 1.本教材共96节课,适用于3-5年级.40人.40分钟的课堂: 2.初期我会把每节课的代码控制在10行以内,后期再逐渐增加: 3.欢迎提意见. 课程摘要 ——————— [ ...

  3. adb链接时报错误10061解决方法

    首先打开开发者选项然后依次操作: 1. 将安卓设备usb连接到电脑 2. 设备链接到wifi 3. Ping设备ip,检查是否可通信 4. 在cmd依次输入以下命令: 5. adb usb 6. ad ...

  4. (二十七)JSP标签之核心标签

    一.诞生 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码. 二.JSTL 分类 核心标签(用得最多) ...

  5. (九)Struts标签基础(二)

    2.3 非表单标签 2.3.1 <s:actionerror>标签, this.addActionError("错误信息1");   //使用addActionErro ...

  6. IdentityServer4密码模式接入现有用户数据表

    具体接入identityserver请看文档,这里只简单列举部分步骤 1.创建一个web项目,引入Identityserver4的nuget包 2.新建一个类,实现IResourceOwnerPass ...

  7. iis 虚拟目录 文件服务器

    需求 多节点站点部署时,上传文件地址统一 调整步骤如下 建立文件服务器 共享目录 设置账号密码 各服务器建账号 密码 需与文件服务器账号密码一致 调整 web.config 在<system.w ...

  8. 在CentOS部署AspNetCore网站

    前段时间某云服务器大促,就买了一台打算折腾一下,买了几个月,却啥也没做,就改了个初始密码.最近快到双十一了,另一家厂商相同配置的服务器价格又便宜了一大截,看来又得剁手了.从今年开始,搜索一下云服务器, ...

  9. 关于MQ的几件小事(四)如何保证消息不丢失

    1.mq原则 数据不能多,也不能少,不能多是说消息不能重复消费,这个我们上一节已解决:不能少,就是说不能丢失数据.如果mq传递的是非常核心的消息,支撑核心的业务,那么这种场景是一定不能丢失数据的. 2 ...

  10. h5获取地理坐标

    h5获取地理坐标 方法:h5自带获取地理信息的api api:navigator.geolocation.getCurrentPosition https://developer.mozilla.or ...