题目链接: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. 2 个案例带你迅速入门 Python Flask 框架

    Flask 是 python 中非常流行的一个 web 框架,容易学习.这篇文章主要通过 2 个实际案例讲解 Flask 如何使用.第一个例子是实现一个调用公交车到站信息的接口服务:第二个例子是通过接 ...

  2. Vue项目中设置每个单页面的标题

    两种实现方法,第一种方法引入插件,第二种为编程方式实现(推荐) 首先在路由文件index.js中给每个单页面路由添加title routes: [{     path: '/',     name: ...

  3. ST函数(ST表)RMQ O(1)查询 离线

    ST算法是基于倍增的动态规划算法. #include<iostream> #include<cstdio> #include<cstdlib> #include&l ...

  4. RF(元素定位)

    1.id 定位 Open Browser https://www.baidu.com gc Input Text id=kw selenium #注意 id 的值 kw 没有用引号括起来 Close ...

  5. nginx的数据结构集合(随时更新)

    在学习nginx的时候,因为其数据结构略多,看过后一般就忘记了.所以边学习边记录在这里吧,方便以后查看. ngx_buf_t:缓冲区结点 1: typedef struct ngx_buf_s ngx ...

  6. Jenkins+Ansible+Gitlab自动发布/回滚Spring项目

    一.实现方法流程图 流程图如下:代码托管在本地GitLab上(为了复现整套流水线,我直接使用了GitHub,懒得再搭建GitLab),开发完成后提交代码到代码仓库,[自动]触发Jenkins进行持续集 ...

  7. 算法---BitMap

    问题: 假设有3亿个整数(范围0-2亿),如何判断某一个树是否存在.局限条件一台机器,内存500m. 常规的思路:我们可以将数据存到一个集合中,然后判断某个数是否存在:或者用一个等长的数组来表示,每个 ...

  8. Unix的I/O模型

    对于一次I/O操作(以read为例),数据首先被拷贝到内核的某个缓冲区,然后再从内核缓冲区拷贝到应用进程缓冲区. 因此,一次I/O操作通常包含两个阶段: (1) 等待数据准备好 (2) 从内核向进程复 ...

  9. 【MIT6.828】centos7下使用Qemu搭建xv6运行环境

    title:[MIT6.828]centos7下使用Qemu搭建xv6运行环境 date: "2020-05-05" [MIT6.828]centos7下搭建xv6运行环境 1. ...

  10. Tomcat Ghostcat - AJP协议漏洞DEBUG

    环境 IntelliJ IDEA 2020.1 x64 tomcat-8.5.46 配置 pom.xml <?xml version="1.0" encoding=" ...