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枚举箱子用哪个面.然后按长为第一关键字,宽为第二关键字,从大到小排 ...
随机推荐
- scratch少儿编程第一季——04、想要做到有的放矢,瞄准方向很重要
各位小伙伴大家好: 上期我们学习了动作模块的前面三个指令,今天我们继续学习下面的5个指令. 首先来看第一个(控制方向): 面向90方向默认就是屏幕的右边. 点击白色文本框上面的▼可以打开下拉菜单. 大 ...
- java——多态例题
class A { public String show(D obj) { return ("A and D"); } public String show(A obj) { re ...
- 数据结构——java实现栈
栈 定义: 栈是一种先进后出的数据结构,我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何元素的栈称为空栈 栈的java代码实现: 基于数组: import org.junit.jupite ...
- datagrid行内编辑
编辑属性 :editor: { type: 'text'} $('#listShow').datagrid({ height : 478, pagesize : 20, pageList : [20, ...
- JS与JQuery的一些对比
主页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...
- Microsoft Internet Explorer v11 XML External Entity Injection 0day
[+] Credits: John Page (aka hyp3rlinx) [+] Website: hyp3rlinx.altervista.org[+] Source: http://hyp3 ...
- Android开发之图像处理那点事——滤镜
在Android开发中,一般对图像的处理就是Bitmap(位图),它包含了图像的全部数据,即点阵和颜色值,点阵就是包含像素点的矩阵,而颜色值就是ARGB,分别代表透明.红色.绿色.蓝色通道,它们共同决 ...
- leetcode-100. Same Tree · Tree + DFS + Queue
题面 对比两棵二叉树是否相同,返回结果. 思路 1. 递归解决DFS 首先判断根节点,如果都空,返回true: 如果一空一不空,返回false: 如果都不空,判断两节点值是否相同,若不同,返回fals ...
- ubuntu16.04安装zabbix-server3.4
一.安装前环境准备 部署zabbix需要安装apache,mysql和php sudo apt-get install apache2 sudo apt-get install mysql-serve ...
- yml格式的在线转换工具
工具1: https://www.toolfk.com/tool-format-yaml 工具2: https://www.toyaml.com/index.html https://www.cnbl ...