题目传送门

我校神仙出的神仙题 \(\%\%\%\)


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 逛庭院相关推荐

  1. Luogu P3953 逛公园

    不管怎么说,这都是一道十分神仙的NOIp题 你可以说它狗,但不可以否认它就是NOIp的难度 首先这道题很显然是道图论题还是一道图论三合一(最短路+拓扑+图上DP) 先考虑最短路,我们分别以\(1\)和 ...

  2. [luogu5008]逛庭院

    首先我们看到数据范围.妈耶!数据这么大,一开始还想用个DP来做,但是看着就不行,那么根据这个数据范围,我们大致可以猜到这道题的算法是一个贪心,那么我们怎么贪呢? 我们首先还是先画一个图: 样例解释一下 ...

  3. [Luogu]P1638逛画展

    注意到满足要求的区间具有单调性,于是想到用滑动窗口. 区间具有单调性,即若[L,R]满足条件, [L,R+1]必满足条件,并且[R+1,L]有可能满足条件.如此一来不用O(n^2)枚举左右端点,这样去 ...

  4. tarjan习题题解

    tarjan习题 一.割点: 1.模板: 洛谷P3388 [模板]割点(割顶) 题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面 ...

  5. 【常用技巧精选】尺取法

    整理的算法模板合集: ACM模板 目录 1.反向扫描 1 找指定和的整数对 A.UVA1121 Subsequence B.POJ 3320 Jessica's Reading Problem C.l ...

  6. [yLOI2018] 锦鲤抄

    题目 题目背景 你在尘世中辗转了千百年, 却只让我看你最后一眼. 火光描摹容颜燃尽了时间, 别留我一人,孑然一身,凋零在梦境里面. -- 银临 & 云の泣<锦鲤抄> 本题原名< ...

  7. 【ybt高效进阶4-4-3】【luogu P4513】公园遛狗 / 小白逛公园

    公园遛狗 / 小白逛公园 题目链接:ybt高效进阶4-4-3 / luogu P4513 题目大意 给你一个序列,要维护两个操作. 单点修改和在一个区间中找权值最大的子区间的权值. 思路 其实这个是很 ...

  8. 程序员平时都喜欢逛什么论坛呢?

    Hey guys ,我是 cxuan ,作为程序员,大家的日常工作当然是编码了,但是俗话说得好,上战场,你得有枪!撸码,你得有工具!所以今天,我就给大家分享一波我所知道的一些优质的学习网站,如果对你有 ...

  9. 深夜,我常逛的几个网站。

    程序员的工作和日常生活非常的枯燥,这里给大家推荐一些程序员经常使用的网站,也是我经常上的一些网站,我将会从多个角度.多个层面为你整理归纳这些网站和论坛 01 项目类 项目是一个面试官非常看重的点,也是 ...

  10. 尺取法 P1638 逛画展

    P1638 逛画展 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 其实就是求刚好拥有所有m种数字的最短区间 思路: 尺取法 当区间内数字种数刚好为m时记录一下最小区间长度 ...

最新文章

  1. mysql查询各个知识点
  2. python文件的编译
  3. 图像低频高频区域分离
  4. 批处理之列出目录下所有文件
  5. android insmod命令,android的启动脚本(init.rc)文件的语法
  6. Volatility内存分析工具-某即时通讯软件Windows端数据库密钥的分析
  7. Python中断并继续
  8. C++Debug Assertion Failed!到底出错在哪里?
  9. webstorm开发工具找回被误删除的代码
  10. 原型设计之Axure RP
  11. strcmp函数用法
  12. Xilinx下载安装与在win10闪退问题解决方法
  13. freemarker 数组转字符串_freemarker中的split字符串分割
  14. 技术至简-8:调制解调到底是什么样的数学运算?---从时域和频域两个角度看调制解调的本质
  15. 洛必达法则-求导的方法求解出极限
  16. 《赖氏经典英语语法》练习三 关系词
  17. h5中的结构元素header、nav、article、aside、section、footer介绍
  18. php可以开发大型网站吗?其实这个问题不用回答
  19. 锐捷文件描述错误linux,Kubuntu 14.10 MentoHUST 配置libpcap 锐捷校园网登录总结
  20. 使用PowerShell 获取AAD 用户的license授予时间

热门文章

  1. 2018年大数据趋势丨大数据的黄金时代
  2. 再学点分治——动态点分治
  3. BZOJ3997 TJOI2015组合数学(动态规划)
  4. C语言实例解析精粹学习笔记——36(模拟社会关系)
  5. 第三方监测平台在道路安全管理中的应用
  6. Android-基本控件和详解四种布局方式
  7. 你的第一个自动化测试:Selenium 自动化测试
  8. PythonAM3_统计量分析
  9. linux安装vmware出现Gtk-Message: Failed to load module pk-gtk-module canberra-gtk-module的解决方法...
  10. 我们通过一个服务器程序,以研究backlog参数对listen系统调用的影响,运行截图如下...