题目链接: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. SpringBoot系列(十二)过滤器配置详解

    SpringBoot(十二)过滤器详解 往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件 ...

  2. HTML 教程之常用html标签

    前端三把利器: HTML:赤裸裸的人 20个标签 CSS:华丽的衣服  颜色 位置 …… JS:让这个人动起来 一.HTML本质及在web程序中的作用 web访问中,浏览器充当一个socket客户端. ...

  3. 深入认识CSS的块级元素

    2019独角兽企业重金招聘Python工程师标准>>> 块级元素: 显示在一块内,会自动换行,元素会从上到下垂直排列,各自占一行.每个块级元素默认占一行高度,一行内添加一个块级元素后 ...

  4. Qt之QListWidget:项目的多选与单选设置

    2019独角兽企业重金招聘Python工程师标准>>> #include "widget.h" #include <QApplication> #in ...

  5. FastReport.Net中使用列表和数组作为报表数据源

    大多数现代报告工具允许您使用几乎任何数据库,然而,并不是所有报表工具都能以一个数据源的列表或数组来工作.本文中将展示如何使用FastReport .Net报表工具来实现. 请注意以下重要几点: 清单中 ...

  6. 替换input单选框的样式

    实现效果:. css的input单选框的样式很丑,有时候不想使用原生的样式,如上照片,可以使用下面的方法. 思路是,给inpu加visibility:hidden隐藏,然后使用不同的图片绝对定位覆盖在 ...

  7. CF1335E Three Blocks Palindrome

    就是我这个菜鸡,赛时写出了 E2 的做法,但是算错复杂度,导致以为自己的做法只能AC E1,就没交到 E2 上,然后赛后秒A..... 题意 定义一种字串为形如:\([\underbrace{a, a ...

  8. python(re 模块)

    1.re.match() 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none. group() 以str形式返回对象中match的元素 start() 返回 ...

  9. 如何使用thrift 服务引擎组件

    在本文中将介绍如果通过thrift 组件集成到surging 微服务引擎中,然后可以选择dotnetty 或thrift作为服务远程调用RPC,也可以通过其它语言的thrift 调用surging 服 ...

  10. struts2入门教学

    我的博客地址:https://blog.csdn.net/qq_41907991 首先介绍一下struts2使用的基本步骤: 1.导入相关的 jar 文件 2.需要在 web.xml 文件中配置一个 ...