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枚举箱子用哪个面.然后按长为第一关键字,宽为第二关键字,从大到小排 ...
随机推荐
- 【规律】Cunning Friends
Cunning Friends 题目描述 Anthony and his friends Ben and Chris decided to play a game. They have N piles ...
- Scratch2.0教材(9)——合体大变身
教材说明 ——————— 1.本教材共96节课,适用于3-5年级.40人.40分钟的课堂: 2.初期我会把每节课的代码控制在10行以内,后期再逐渐增加: 3.欢迎提意见. 课程摘要 ——————— [ ...
- adb链接时报错误10061解决方法
首先打开开发者选项然后依次操作: 1. 将安卓设备usb连接到电脑 2. 设备链接到wifi 3. Ping设备ip,检查是否可通信 4. 在cmd依次输入以下命令: 5. adb usb 6. ad ...
- (二十七)JSP标签之核心标签
一.诞生 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码. 二.JSTL 分类 核心标签(用得最多) ...
- (九)Struts标签基础(二)
2.3 非表单标签 2.3.1 <s:actionerror>标签, this.addActionError("错误信息1"); //使用addActionErro ...
- IdentityServer4密码模式接入现有用户数据表
具体接入identityserver请看文档,这里只简单列举部分步骤 1.创建一个web项目,引入Identityserver4的nuget包 2.新建一个类,实现IResourceOwnerPass ...
- iis 虚拟目录 文件服务器
需求 多节点站点部署时,上传文件地址统一 调整步骤如下 建立文件服务器 共享目录 设置账号密码 各服务器建账号 密码 需与文件服务器账号密码一致 调整 web.config 在<system.w ...
- 在CentOS部署AspNetCore网站
前段时间某云服务器大促,就买了一台打算折腾一下,买了几个月,却啥也没做,就改了个初始密码.最近快到双十一了,另一家厂商相同配置的服务器价格又便宜了一大截,看来又得剁手了.从今年开始,搜索一下云服务器, ...
- 关于MQ的几件小事(四)如何保证消息不丢失
1.mq原则 数据不能多,也不能少,不能多是说消息不能重复消费,这个我们上一节已解决:不能少,就是说不能丢失数据.如果mq传递的是非常核心的消息,支撑核心的业务,那么这种场景是一定不能丢失数据的. 2 ...
- h5获取地理坐标
h5获取地理坐标 方法:h5自带获取地理信息的api api:navigator.geolocation.getCurrentPosition https://developer.mozilla.or ...