题目链接:https://vjudge.net/problem/Gym-101612H

知识点:  贪心

解题思路:

  我们称除了以 \(1\) 号结点为根的树以外的树为 “其他树”。

  对于每一棵树,先自底向上贪心地组队,记录下每一棵其他树没有组队的结点数及根结点是否有组队,然后对其他树进行排序(排序优先法则请参考 \(cmp()\) 函数)。

  对于根结点已经有组队的树,我们直接让根结点连接 \(1\) 号结点即可;对于根结点没有组队的树,我们可以让根结点连现有的树里面没有组队的结点(如果现有的树里面的结点都已经有组队了,则直接连接到 \(1\) 号结点)。这部分我选择用一个 \(queue\) 来维护现有的树中没有组队的结点。

AC代码:

 #include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+; struct Node{
int ID;
bool HeadHave;
int NoHave;
};
vector<int> to[maxn];
bool rot[maxn],have[maxn];
vector<Node> head;
queue<int> notn; void dfs(int s){
if(to[s].empty())
return;
for(int i=;i<to[s].size();i++){
dfs(to[s][i]);
if(!have[to[s][i]]&&!have[s])
have[s]=have[to[s][i]]=true;
}
}
void dfs1(int s){
if(!have[s]) notn.push(s);
for(int i=;i<to[s].size();i++){
dfs1(to[s][i]);
}
}
bool cmp(const Node &a,const Node &b){
if(a.HeadHave&&!b.HeadHave) return true;
else if(!a.HeadHave&&b.HeadHave) return false;
else{
if(a.NoHave>b.NoHave) return true;
else return false;
}
}
int dfs2(int s){
int ret=;
if(!have[s]) ret++;
for(int i=;i<to[s].size();i++)
ret+=dfs2(to[s][i]);
return ret;
} int ans[maxn];
int main(){
freopen("hidden.in","r",stdin);
freopen("hidden.out","w",stdout);
int n;
scanf("%d",&n);
memset(rot,true,sizeof(rot));
for(int i=;i<n;i++){
int x;
scanf("%d",&x);
if(x){
to[x].push_back(i+);
ans[i+]=x;
rot[i+]=false;
}
}
Node tmp;
for(int i=;i<=n;i++){
if(rot[i]){
dfs(i);
if(i!=){
tmp.HeadHave=have[i];
tmp.ID=i;
tmp.NoHave=dfs2(i);
head.push_back(tmp);
}
}
}
sort(head.begin(),head.end(),cmp); dfs1();
for(int i=;i<head.size();i++){
int id=head[i].ID;
if(have[id]){
ans[id]=;
dfs1(id);
} else{
if(notn.size()){
int x=notn.front();
notn.pop();
have[x]=have[id]=true;
ans[id]=x;
dfs1(id);
} else{
ans[id]=;
dfs1(id);
}
}
}
int has=;
for(int i=;i<=n;i++){
if(have[i]) has++;
}
printf("%d\n",has/);
for(int i=;i<=n;i++){
if(i!=) printf(" ");
printf("%d",ans[i]);
}
printf("\n"); return ;
}

Gym101612H Hidden Supervisors的更多相关文章

  1. NEERC训练实录

    听说这里可以做一些idea比较好的题.. 那就做做吧 2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest A. Auxiliary Proj ...

  2. 2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest

    A. Auxiliary Project 完全背包. #include<stdio.h> #include<iostream> #include<string.h> ...

  3. 表单reset无法重置hidden的解决方案

    方法一:用text代替hidden,设置text隐藏 <input id="id" name="id" style="display: none ...

  4. overflow:hidden与margin:0 auto之间的冲突

    相对于父容器水平居中的代码margin:0 auto与overflow:hidden之间存在冲突.当这两个属性同时应用在一个DIV上时,在chrome浏览器中将无法居中.至于为啥我也不明白.

  5. 移动端浏览器body的overflow:hidden并没有什么作用

    今天突然遇到一个问题,使用li模拟select,但是碰到一个很尴尬的问题,给body加了overflow:hidden,但是body并没有禁止滚动条,滚动条依旧顺滑. <!DOCTYPE htm ...

  6. display:none与visible:hidden的区别 slideDown与

    display:none与visible:hidden的区别 display:none和visible:hidden都能把网页上某个元素隐藏起来,但两者有区别: display:none ---不为被 ...

  7. 关于display:none 和visibility:hidden 的区别

    1.占据空间 :none 隐藏后不占据空间 visibility占据空间 2.回流与渲染:none产生回流与渲染 ? 可以通过oprea中的Profiler 工具测试. 关于回流的详细介绍:http: ...

  8. toArray(),toJson(),hidden([ ]),visible([ ])

    toArray() 转换为数组,hidden()不输出的字段 public function index(){ $user = model('User'); $data = $user::)-> ...

  9. asp.net Application、 Session、Cookie、ViewState、Cache、Hidden 的区别

    这些对象都是用来保存信息的,包括用户信息,传递值的信息,全局信息等等.他们之间的区别: 1.Application对象 Application用于保存所有用户的公共的数据信息,如果使用Applicat ...

随机推荐

  1. java基础问题 (待解决)

    (1)接口与抽象类的区别? (2)Java中的异常有哪几类?分别怎么使用? (3)常用的集合类有哪些?比如List如何排序? (4)ArrayList和LinkedList内部的实现大致是怎样的?他们 ...

  2. Spark学习笔记(一)

    概念: Spark是加州大学伯克利分校AMP实验室,开发的通用内存并行计算框架. 支持用scala.java和Python等语言编写应用程序.相较于Hdoop,往往有更好的运行效率. Spark包括了 ...

  3. Character Array and Character Pointer

    最近复习数据结构实验时,碰到这么一行代码,看的有点不爽. typedef char** HuffmanCode; 借此梳理下数组和指针. int* p; //指针变量p中存的地址代表的内存单元中的数据 ...

  4. Jaba_Web--JDBC 修改记录操作模板

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  5. 数学--数论--HDU - 6124 Euler theorem (打表找规律)

    HazelFan is given two positive integers a,b, and he wants to calculate amodb. But now he forgets the ...

  6. Codeforce 322E Ciel the Commander (点分治)

    E. Ciel the Commander Now Fox Ciel becomes a commander of Tree Land. Tree Land, like its name said, ...

  7. P6474 [NOI Online #2 入门组] 荆轲刺秦王

    P6474 [NOI Online #2 入门组] 荆轲刺秦王 bfs+差分+卡常 本来我其实是场内选手,但是因为记错提交时间,晚了半小时才交,交不上了,就自动降级为了场外选手 题面复杂,不简述了 首 ...

  8. prufer编码学习笔记

    prufer 编码 对于一个无根树,他的 prufer 编码是这样确定的: 每次找到编号最小的一个叶子节点,也就是度数为\(1\)的节点,把和它相连的点,加入 prufer 编码序列的末尾,然后把这个 ...

  9. Spring依赖注入—@Resource注解使用

    1.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowire ...

  10. 应用开发实践之关系型数据库(以MySql为例)小结

    本文主要是对目前工作中使用到的DB相关知识点的总结,应用开发了解到以下深度基本足以应对日常需求,再深入下去更偏向于DB本身的理论.调优和运维实践. 不在本文重点关注讨论的内容(可能会提到一些): 具体 ...