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. MogileFS表说明

    MogileFS大致的表说明如下 checksum:用来存放文件的校验和class:文件分类定义device:主机上的可用设备定义,包括设备可用空间,使用的权重等信息domain:域定义信息file: ...

  2. poj 3617 弱鸡贪心

    比赛的时候扣了一道贪心的题目,不会写,,现在补一补一些基础的贪心. 题意:给定一个字符串s,要求按下列操作生成一个新串t--每次从s串中的最前和最后取一个字符给t,要求生成的t字典序最小. 题解:由于 ...

  3. hdu 1203 转换的01包问题。。。。

    俗话说的话 正难则反.,.  这个基本的思想都用不好的话 回家种田去吧. #include<cstdio> #include<string.h> #include<ios ...

  4. (三)springmvc之注解的基本使用

    一.@Controller @Controller 标记一个类是Controller 二.RequestMapping  地址映射 2.1 Value的操作. 注解在类上面    (父)       ...

  5. Ctrl+R快速启动应用程序

    1.打开注册表 Ctrl+R搜索框中键入“regedit”,回车打开注册表 2.找到HKEY_LOCAL_MACHINE中的如下路径 HKEY_LOCAL_MACHINE\SOFTWARE\Micro ...

  6. DotNet跨平台 - docker部署.net core2.0项目

    参考文档: https://docs.docker.com/install/linux/docker-ce/centos/ http://www.dockerinfo.net/document htt ...

  7. 二零一八阿里p7笔试116题

    1. junit用法,before,beforeClass,after, afterClass的执行顺序 2. 分布式锁 3. nginx的请求转发算法,如何配置根据权重转发 4. 用hashmap实 ...

  8. 11 Windows编程——定时器

    周期性的发送WWL_TIMER消息的一个东西,这个周期可以由程序员自己设定.设定周期的数是SetTimer,停止定时器消息发送的函数是:Killximer: 定时器消息的特点: 1.不准确(也就是说, ...

  9. 【问题】为啥WMWare Workstation里面虚拟机的网关默认是NAT网关

    今天做KickStart自动化安装实验,无意中发现一个奇怪现象. 先描述下我的实验环境:笔记本Win10,安装了WMWare Workstation,在WMWare Workstation上面安装了C ...

  10. sql注入原理,利用与防护

    一.sql注入原理 注入攻击的本质就是把用户输入的数据当作代码来执行.所以注入攻击有两个必要条件 1.用户能够控制的输入. 2.原本程序要执行的代码,拼接了用户输入的数据. 二.sql注入分类 按照请 ...