[POI2004] SZP (贪心+拓扑排序)
【问题描述】
Byteotian 中央情报局(BIA) 雇佣了许多特工. 他们每个人的工作就是监视
另一名特工.
Byteasar 国王需要进行一次秘密行动,所以他要挑选尽量多的信得过的特工. 但
是这项任务是如此的机密以至于所有参加行动的特工都必须至少被另一名没有
参加任务的特工所监视(就是说如果某个特工参加了行动,那么原先监视他的那些
特工中至少要有一个没有参加进行动). 给出监视任务的详情,要求计算最多能有
多少个特工参与其中.
【输入格式】
第一行只有一个整数, n – 特工的总数, 2 <= n <= 1000000. 特工从1 到n
编号. 接下来n 行每行一个整数ak 表示特工k 将要监视特工ak , 1 <= k <= n, 1
<= ak <= n, ak <> k.
【输出格式】
打印一个数,最多能有多少特工参加入这个任务.
【样例输入】
6
2
3
l
3
6
5
【样例输出】
3
每个点的出度都为\(1\),很容易看出是基环外向树然而并没有用
贪心+拓扑排序,如果一个点不选,则他的儿子一定要选。
最后还剩下环,随便找个位置拆开就行了。
#include <cstdio>
#define Open(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout);
#define Close fclose(stdin);fclose(stdout);
namespace IO{
int xjc; char ch;
inline int read(){
xjc = 0; ch = getchar();
while(ch < '0' || ch > '9') ch = getchar();
while(ch >= '0' && ch <= '9'){ xjc = xjc * 10 + ch - '0'; ch = getchar(); }
return xjc;
}
}using namespace IO;
inline int min(int a, int b){
return a > b ? b : a;
}
const int MAXN = 1000010;
struct Queue{
int s[MAXN];
int head, tail;
inline void push(int x){
s[++tail] = x;
}
inline int pop(){
return s[++head];
}
inline int size(){
return tail - head;
}
}q;
int n, a[MAXN], ans, vis[MAXN], in[MAXN]; //vis为1表示不选,为2表示选
int main(){
Open("szp");
n = read();
for(int i = 1; i <= n; ++i)
++in[a[i] = read()];
for(int i = 1; i <= n; ++i)
if(!in[i]) vis[i] = 1, q.push(i);
while(q.size()){
int now = q.pop();
if(vis[now] == 1) vis[a[now]] = 2;
if(!(--in[a[now]])){
q.push(a[now]);
if(!vis[a[now]]) vis[a[now]] = 1;
}
}
for(int i = 1; i <= n; ++i){ //找剩下的环
if(!vis[i]){
int now = a[i], pos = i;
while(now != i){
if(vis[now]){
pos = now;
break;
}
now = a[now];
}
q.push(pos);
}
}
while(q.size()){
int now = q.pop();
if(vis[now] == 1 && !vis[a[now]]) vis[a[now]] = 2;
if(!(--in[a[now]])){
q.push(a[now]);
if(!vis[a[now]]) vis[a[now]] = 1;
}
}
for(int i = 1; i <= n; ++i)
if(vis[i] == 2) ++ans;
printf("%d\n", ans);
return 0;
}
[POI2004] SZP (贪心+拓扑排序)的更多相关文章
- hdu-5695 Gym Class(贪心+拓扑排序)
题目链接: Gym Class Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- Aizu 2456 Usoperanto 贪心 拓扑排序
Usoperanto Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/contest_show.php?cid= ...
- 2016"百度之星" - 初赛(Astar Round2A)1006 Gym Class(HDU5695)——贪心+拓扑排序
分析:首先,利用贪心可知,如果要所有人的分数和最高,需要把序号大的优先放在前面.其次,对于a的前面不能为b,那么只能a在b前面了,那么就建立一条从a到b的边,并且b的入度加1.然后就是拓扑排序了.要分 ...
- poj 3687 Labeling Balls - 贪心 - 拓扑排序
Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 to N ...
- 贪心+拓扑排序 AOJ 2456 Usoperanto
题目传送门 题意:给出一条链,比如x连到y,x一定要在y的左边,且代价是这条链经过的点的权值和,问如何排序使得代价最小 分析:类似拓扑排序,先把入度为0的点入队,把指向该点的所有点按照权值排序,保证这 ...
- Berland Army CodeForces - 883B (贪心,拓扑排序)
大意: n个点, 点$i$的等级为$r_i$, 只给出部分点的$r$值, $r_i$的范围为[1,k], 且[1,k]都至少有一个. 给定m条有向边, (x,y)表示$r[x]>r[y]$, 求 ...
- Luogu P5603 小C与桌游【贪心+拓扑排序】
[Description]https://www.luogu.com.cn/problem/P5603 \(\;\) 题意可以简化为:一个不保证联通,n个点,m条边的DAG(有向无环图),构造一个拓扑 ...
- POJ3687 Labeling Balls(拓扑排序\贪心+Floyd)
题目是要给n个重量1到n的球编号,有一些约束条件:编号A的球重量要小于编号B的重量,最后就是要输出字典序最小的从1到n各个编号的球的重量. 正向拓扑排序,取最小编号给最小编号是不行的,不举出个例子真的 ...
- 2019.01.20 bzoj5158 Alice&Bob(拓扑排序+贪心)
传送门 短代码简单题. 题意简述:对于一个序列XXX,定义其两个伴随序列a,ba,ba,b,aia_iai表示以第iii个数结尾的最长上升子序列长度,bib_ibi表示以第iii个数开头的最长下降 ...
随机推荐
- c++设计模式----装饰模式
前言 在实际开发时,你有没有碰到过这种问题:开发一个类,封装了一个对象的核心操作,而这些操作就是客户使用该类时都会去调用的操作:而有一些非核心的操作,可能会使用,也可能不会使用:现在该怎么办呢? 将这 ...
- 3dContactPointAnnotationTool开发日志(一)
周日毕设开题报告结束后浪了一天,今天又要开始回归正轨了.毕设要做一个人和物体的接触点标注工具,听上去好像没啥难度,其实实现起来还是挺麻烦的. 今天没做啥,就弄了个3d场景做样例.把界面搭了一下 ...
- python爬虫 --- 简书评论
某些网站的一些数据是通过js加载的 ,所以爬取下来的数据拿不到, 找到评论的地址 .进行请求获取评论数据 #coding=utf-8 import json import requests def r ...
- 【Linux】- Ubuntu安装nginx
安装 执行命令: sudo apt-get install nginx 执行如图: 防火墙设置 查看防火墙状态: sudo ufw status 查看可以穿过防火墙的应用列表: sudo ufw ap ...
- 异步执行任务SimpleAsyncTaskExecutor详解
SimpleAsyncTaskExecutor 异步执行用户任务的SimpleAsyncTaskExecutor.每次执行客户提交给它的任务时,它会启动新的线程,并允许开发者控制并发线程的上限(con ...
- context.getResourceAsStream获取的是部署在服务器上面的文件位置 而不是我们本地的工程位置 意思是说获取的都是web下面的文件位置
context.getResourceAsStream获取的是部署在服务器上面的文件位置 而不是我们本地的工程位置 意思是说获取的都是web下面的文件位置
- table 标签 语法
- 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询
题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...
- Python re(正则表达式)模块
python正则表达式 正则表达式是一个特殊的字符序列,它能帮助我们方便的检查一个字符串是否与某种模式匹配.Python自1.5版本起增加了re模块,它提供Perl风格的正则表达式模式.re模块使Py ...
- 【题解】51nod 1203JZPLCM问题
这题好强强啊,貌似是集训队原题?集训队原题当中值域是1e9的范围,这样各种乱搞是妥妥的不能过了,只能写正解的离线+树状数组维护前缀积. 最开始我写了几种乱搞做法,包括莫队和线段树做法.其中表现比较优秀 ...