P1543 [POI2004] SZP 题解
P1543 [POI2004] SZP 题解
题目简述
有 \(n\) 个人,每个人都会监视另一个人,要求选出尽可能多的同学,使得选出的每一名同学都必定会被监视到。且选出的同学不可再监视其他人。
思路简述
因为任意一个人只能被另一个人管,那么就想到,如果没人管的同学就不能被选(不被监视)。
若某个人有多个人监视,且监视他的有至少一个专门监视(监视他的那个人没人监视)则他不得不去。
那么再看看如果出现环咋办。
不如画个图理解。

上图即为一个环:\(1\) 监视 \(2\),\(2\) 监视 \(3\),\(3\) 监视 \(1\)。
那么不妨枚举一下。
如果派出 \(1\),则 \(3\) 可以监视到,而 \(2\) 也可以监视到 \(3\),完美符合题意。
但是,若取出了 \(1\) 和 \(2\),\(2\) 则会没人监视(本来监视他的 \(1\) 号走了)。
所以可以得出结论:若遇到环,设 \(s\) 为环的节点个数,则取出的个数为 \(\lfloor\frac{s}{2}\rfloor\)。
代码实现
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,to[N],ans,cnt_ring,in[N];
bool gone[N]/*被选中了吗*/,vis_ring[N]/*遍历过了吗*/;
queue<int > q;//注意:这里的q可不是说进队列了就得被选中
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&to[i]);
++in[to[i]];//入度+1
}
for(int i=1;i<=n;i++)
if(!in[i])//拓扑排序老板子
q.push(i);
while(!q.empty())
{
int t=q.front();q.pop();
vis_ring[t]=true;//判断是否遍历过
if(gone[t])//他走了,他监视的同学就看看情况
{
if((--in[to[t]])==0)
q.push(to[t]);
}
else//他没走,他监视的孩子可就遭老罪喽
{
if(!gone[to[t]])//孩子没走
{
++ans;
gone[to[t]]=true;//给我走
q.push(to[t]);
}
}
}
for(int i=1;i<=n;i++)//开始判环
{
if(!vis_ring[i]&&in[i])
{
cnt_ring=0;//作用如其名
for(int j=i;!vis_ring[j];j=to[j])
{
++cnt_ring;
vis_ring[j]=true;
}
ans+=cnt_ring/2;//刚说的,不过C++自动向下取整
}
}
printf("%d\n",ans);
return 0;
}
P1543 [POI2004] SZP 题解的更多相关文章
- Bzoj: 2073 [POI2004]PRZ 题解
2073: [POI2004]PRZ Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 401 Solved: 296[Submit][Status][D ...
- 【BZOJ3037/2068】创世纪/[Poi2004]SZP 树形DP
[BZOJ3037]创世纪 Description applepi手里有一本书<创世纪>,里面记录了这样一个故事……上帝手中有着N 种被称作“世界元素”的东西,现在他要把它们中的一部分投放 ...
- [POI2004] SZP (贪心+拓扑排序)
[问题描述] Byteotian 中央情报局(BIA) 雇佣了许多特工. 他们每个人的工作就是监视 另一名特工. Byteasar 国王需要进行一次秘密行动,所以他要挑选尽量多的信得过的特工. 但 是 ...
- 创世纪 BZOJ3037 & [Poi2004]SZP BZOJ2068
分析: 树形DP中的一种,基环树DP 针对每一个环跑DP,f[i],g[i]分别表示选或者不选,之后我们注意每次遍历的时候,不要重复遍历. 附上代码: #include <cstdio> ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 【BZOJ2073】[POI2004]PRZ 状压DP
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
- 【BZOJ2067】[Poi2004]SZN 二分+树上贪心
[BZOJ2067][Poi2004]SZN Description String-Toys joint-stock 公司需要你帮他们解决一个问题. 他们想制造一个没有环的连通图模型. 每个图都是由一 ...
- bzoj 2073: [POI2004]PRZ
2073: [POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的 ...
- 【POI】T1 特工 szp
T1 特工szp [问题描述] Byteotian 中央情报局 (BIA) 雇佣了许多特工. 他们每个人的工作就是监视另一名特工.Byteasar 国王需要进行一次秘密行动,所以他要挑选尽量多的信得过 ...
- [bzoj3037/2068]创世纪[Poi2004]SZP_树形dp_并查集_基环树
创世纪 SZP bzoj-3037/2068 Poi-2004 题目大意:给你n个物品,每个物品可以且仅可以控制一个物品.问:选取一些物品,使得对于任意的一个被选取的物品来讲,都存在一个没有被选取的物 ...
随机推荐
- Git常用命令汇总以及其它相关操作
--文件目录操作命令 1 mkdir * 创建一个空目录 *指目录名 2 pwd 显示当前目录的路径. 3 cat * 查看*文件内容 4 git rm * 删除**文件 --git初始化操作 1 g ...
- oeasy教您玩转vim - 65 - # 批处理操作
批处理操作 回忆上次 我们上次参数列表 arguments list 所谓参数列表指的是 vim 打开的 参数列表 参数会加载到内存中成为 buffer 参数的控制 :arga filename ...
- java面试一日一题:rabbitMQ如何保证消息不丢失
问题:请讲下rabbitMQ如何保证消息不丢失 分析:该问题属于概念题,同时也是一个设计方面的题,牵扯到部分设计层面的东西: 回答要点: 主要从以下几点去考虑, 1.rabbitMQ在保证消息不丢失方 ...
- java17特性:文本块
例子 String content= """ { "text_1":"%s", "text_2":" ...
- 6、Git之团队协作机制
6.1.团队内协作 6.1.1.创建本地库 如上图所示,一个名叫刘备的人,在本地电脑中创建了一个项目,并使用 git 来维护. 6.1.2.推送本地库到代码托管中心 如上图所示,刘备想让别人也能看到自 ...
- 2、SpringBoot2之入门案例
2.1.创建Maven工程 2.1.1.创建空项目 2.1.2.设置项目名称和路径 2.1.3.设置项目sdk 2.1.4.项目初始状态 注意:需要关闭项目再重新打开,才能看到SpringBoot-P ...
- 【Layui】16 表单元素 Form
文档地址: https://www.layui.com/demo/form.html 表单元素: 1.输入框 2.密码框 3.下拉列表 4.单选框 5.复选框 6.文档域 7.富文本 8.开关 单行输 ...
- 【转载】 TensorFlow之name_scope/variable_scope
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u013745804/article/de ...
- Ubuntu 18.04在已经安装Docker CE后如何安装NVIDIA-Docker,以使docker容器内可以使用宿主机显卡
注意: 本文是在电脑上已经安装好docker环境的前提下进行的. docker环境如何安装参照前文. 本文内容节选自: https://baimafujinji.blog.csdn.net/arti ...
- 【转载】 关于Numpy数据类型对象(dtype)使用详解
原文地址: https://www.cnblogs.com/dreamboy2000/p/15350478.html ========================================= ...