Luogu P5008 逛庭院
题目传送门
我校神仙出的神仙题 \(\%\%\%\)
30分
找出所有有入度的点,排序,选前\(k\)个点,好了,30分到手。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
int read(){int k=0,f=1; char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-') f=-1;for(;c>='0'&&c<='9';c=getchar())k=k*10+c-48;return k*f;
}
int a[100010],sum,in[100010],b[100010],top;
bool cmp(int x,int y){return x > y;
}
int main(){int n=read(),m=read(),k=read();for(int i=1;i<=n;i++) a[i]=read();for(int i=1;i<=m;i++){int x=read(),y=read();in[y]++;}for(int i=1;i<=n;i++)if(in[i]) b[++top]=a[i];sort(b+1,b+top+1,cmp);for(int i=1;i<=k;i++) sum+=b[i];cout<<sum;return 0;
}
就这么简单
我跟你讲,这个做法以前是可以AC的
这个做法可以\(A\)掉\(DAG\)的\(Subtask\)
因为图是一个\(DAG\),所以对于所有有入度的点,一定可以将它们全部删去——从后向前删即可。既然所有有入度的点都能删去,我们只要贪心的取出前\(k\)大就好了。
AC
对于\(DAG\),一定可以将所有有入度的点全部删去,而普通有向图就不一样了——有环的存在
如上面\(4\)个点,它们形成了一个环,我们最多只能删掉\(3\)个。因为必定会有一个点被留下,所以我们贪心的留下点权最小的点。
但对环的讨论是十分繁琐的,我们可以先将整张图用\(Tarjan\)缩成一张\(DAG\),每个强连通分量内一定至少有一个环。对于强连通分量,我们分类讨论一下。
- 对于缩点后有入度的强连通分量,十分显然,它内部的点我们可以随便选
- 没有入度的强连通分量,我们必定要留下一个,理由如上所说。同理,我们贪心的留下点权最小的点即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int read(){int k=0; char c=getchar();for(;c<'0'||c>'9';) c=getchar();for(;c>='0'&&c<='9';c=getchar())k=k*10+c-48;return k;
}
struct zzz{int f,t,nex;
}e[2000010]; int head[500010],tot;
void add(int x,int y){e[++tot].t=y; e[tot].f=x;e[tot].nex=head[x];head[x]=tot;
}
struct hhh{int v,pos;
}a[500010];
int dfn[500010],low[500010],deep,vis[500010],colnum[500010],belong[500010],col,s[500010],top;
void Tarjan(int now){ //Tarjan缩点dfn[now]=low[now]=++deep; s[++top]=now; vis[now]=1;for(int i=head[now];i;i=e[i].nex){if(!dfn[e[i].t]){Tarjan(e[i].t);low[now]=min(low[now],low[e[i].t]);}else if(vis[e[i].t])low[now]=min(low[now],dfn[e[i].t]);}if(dfn[now]==low[now]){col++;int v=0;do{v=s[top--];vis[v]=0;colnum[col]++;belong[v]=col;}while(v!=now);}
}
int in[500010],ans;
bool cmp(hhh x,hhh y){return x.v < y.v;
}
bool cmp2(hhh x,hhh y){return x.v > y.v;
}
bool flag[500010],mapp[500010];
int main(){int n=read(),m=read(),k=read();for(int i=1;i<=n;i++)a[i].v=read(), a[i].pos=i;for(int i=1;i<=m;i++){int x=read(),y=read();add(x,y);}for(int i=1;i<=n;i++)if(!dfn[i]) Tarjan(i);memset(head,0,sizeof(head));for(int i=1;i<=tot;i++){ //缩点之后处理入度if(belong[e[i].f]!=belong[e[i].t])++in[belong[e[i].t]];}//=======剔除入度为0的强联通分量里点权最小的点sort(a+1,a+n+1,cmp);for(int i=1;i<=n;i++){if(!in[belong[a[i].pos]]&&!flag[belong[a[i].pos]]){flag[belong[a[i].pos]]=1;mapp[a[i].pos]=1;}}int cnt=0;//=======贪心的从大到小选点sort(a+1,a+n+1,cmp2);for(int i=1;i<=n;i++){if(cnt==k) break;if(mapp[a[i].pos]) continue;ans+=a[i].v; cnt++; }cout<<ans;return 0;
}
在文章的最后,放一下官方题解,233~~~
转载于:https://www.cnblogs.com/wxl-Ezio/p/9911269.html
Luogu P5008 逛庭院相关推荐
- Luogu P3953 逛公园
不管怎么说,这都是一道十分神仙的NOIp题 你可以说它狗,但不可以否认它就是NOIp的难度 首先这道题很显然是道图论题还是一道图论三合一(最短路+拓扑+图上DP) 先考虑最短路,我们分别以\(1\)和 ...
- [luogu5008]逛庭院
首先我们看到数据范围.妈耶!数据这么大,一开始还想用个DP来做,但是看着就不行,那么根据这个数据范围,我们大致可以猜到这道题的算法是一个贪心,那么我们怎么贪呢? 我们首先还是先画一个图: 样例解释一下 ...
- [Luogu]P1638逛画展
注意到满足要求的区间具有单调性,于是想到用滑动窗口. 区间具有单调性,即若[L,R]满足条件, [L,R+1]必满足条件,并且[R+1,L]有可能满足条件.如此一来不用O(n^2)枚举左右端点,这样去 ...
- tarjan习题题解
tarjan习题 一.割点: 1.模板: 洛谷P3388 [模板]割点(割顶) 题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面 ...
- 【常用技巧精选】尺取法
整理的算法模板合集: ACM模板 目录 1.反向扫描 1 找指定和的整数对 A.UVA1121 Subsequence B.POJ 3320 Jessica's Reading Problem C.l ...
- [yLOI2018] 锦鲤抄
题目 题目背景 你在尘世中辗转了千百年, 却只让我看你最后一眼. 火光描摹容颜燃尽了时间, 别留我一人,孑然一身,凋零在梦境里面. -- 银临 & 云の泣<锦鲤抄> 本题原名< ...
- 【ybt高效进阶4-4-3】【luogu P4513】公园遛狗 / 小白逛公园
公园遛狗 / 小白逛公园 题目链接:ybt高效进阶4-4-3 / luogu P4513 题目大意 给你一个序列,要维护两个操作. 单点修改和在一个区间中找权值最大的子区间的权值. 思路 其实这个是很 ...
- 程序员平时都喜欢逛什么论坛呢?
Hey guys ,我是 cxuan ,作为程序员,大家的日常工作当然是编码了,但是俗话说得好,上战场,你得有枪!撸码,你得有工具!所以今天,我就给大家分享一波我所知道的一些优质的学习网站,如果对你有 ...
- 深夜,我常逛的几个网站。
程序员的工作和日常生活非常的枯燥,这里给大家推荐一些程序员经常使用的网站,也是我经常上的一些网站,我将会从多个角度.多个层面为你整理归纳这些网站和论坛 01 项目类 项目是一个面试官非常看重的点,也是 ...
- 尺取法 P1638 逛画展
P1638 逛画展 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 其实就是求刚好拥有所有m种数字的最短区间 思路: 尺取法 当区间内数字种数刚好为m时记录一下最小区间长度 ...
最新文章
- mysql查询各个知识点
- python文件的编译
- 图像低频高频区域分离
- 批处理之列出目录下所有文件
- android insmod命令,android的启动脚本(init.rc)文件的语法
- Volatility内存分析工具-某即时通讯软件Windows端数据库密钥的分析
- Python中断并继续
- C++Debug Assertion Failed!到底出错在哪里?
- webstorm开发工具找回被误删除的代码
- 原型设计之Axure RP
- strcmp函数用法
- Xilinx下载安装与在win10闪退问题解决方法
- freemarker 数组转字符串_freemarker中的split字符串分割
- 技术至简-8:调制解调到底是什么样的数学运算?---从时域和频域两个角度看调制解调的本质
- 洛必达法则-求导的方法求解出极限
- 《赖氏经典英语语法》练习三 关系词
- h5中的结构元素header、nav、article、aside、section、footer介绍
- php可以开发大型网站吗?其实这个问题不用回答
- 锐捷文件描述错误linux,Kubuntu 14.10 MentoHUST 配置libpcap 锐捷校园网登录总结
- 使用PowerShell 获取AAD 用户的license授予时间
热门文章
- 2018年大数据趋势丨大数据的黄金时代
- 再学点分治——动态点分治
- BZOJ3997 TJOI2015组合数学(动态规划)
- C语言实例解析精粹学习笔记——36(模拟社会关系)
- 第三方监测平台在道路安全管理中的应用
- Android-基本控件和详解四种布局方式
- 你的第一个自动化测试:Selenium 自动化测试
- PythonAM3_统计量分析
- linux安装vmware出现Gtk-Message: Failed to load module pk-gtk-module canberra-gtk-module的解决方法...
- 我们通过一个服务器程序,以研究backlog参数对listen系统调用的影响,运行截图如下...