先思考图上是\(tag\)的特殊情况。

考虑我们按拓扑序反过来操作,就可以得到我们任意想要的顺序。

那么我们把所有的图都缩点操作,那么我们只需要考虑一个联通分量里就行了。

一个联通分量最后只会剩下一个不可取的,我们只要判断这个就可以了。

那么按照权值大小排序,再一次判断是否可取即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<stack>
  4. #include<algorithm>
  5. #define ll long long
  6. #define N 500004
  7. std::stack<int>QWQ;
  8. ll n,m,k;
  9. ll head[N],cnt,scc[N],siz[N],in[N];
  10. struct P{
  11. int to,next;
  12. }e[N * 10];
  13. inline void add(int x,int y){
  14. e[++cnt].to = y;
  15. e[cnt].next = head[x];
  16. head[x] = cnt;
  17. }
  18. struct E{
  19. int w,id;
  20. }p[N];
  21. bool operator < (E a,E b){
  22. return a.w > b.w;
  23. }
  24. ll dfn[N],low[N],vis[N],dfncnt,sccnt;
  25. inline void tarjan(ll u){
  26. dfn[u] = low[u] = ++dfncnt;
  27. QWQ.push(u);
  28. vis[u] = 1;
  29. for(int i = head[u];i;i = e[i].next){
  30. int v = e[i].to;
  31. if(!dfn[v]){
  32. tarjan(v);
  33. low[u] = std::min(low[u],low[v]);
  34. }else if(vis[v]){
  35. low[u] = std::min(low[u],dfn[v]);
  36. }
  37. }
  38. if(dfn[u] == low[u]){
  39. ++sccnt;
  40. while(QWQ.top() != u){
  41. scc[QWQ.top()] = sccnt;
  42. siz[sccnt] ++ ;
  43. vis[QWQ.top()] = 0;
  44. QWQ.pop();
  45. }
  46. siz[sccnt] ++ ;
  47. scc[QWQ.top()] = sccnt;
  48. vis[QWQ.top()] = 0;
  49. QWQ.pop();
  50. }
  51. }
  52. ll ans;
  53. int main(){
  54. scanf("%lld%lld%lld",&n,&m,&k);
  55. for(int i = 1;i <= n;++i)
  56. scanf("%d",&p[i].w),p[i].id = i;
  57. std::sort(p + 1,p + n + 1);
  58. for(int i = 1;i <= m;++i){
  59. ll x,y;
  60. scanf("%lld%lld",&x,&y);
  61. add(x,y);
  62. }
  63. for(int i = 1;i <= n;++i){
  64. if(!dfn[i]){
  65. tarjan(i);
  66. }
  67. }
  68. for(int i = 1;i <= n;++i){
  69. for(int j = head[i];j;j = e[j].next){
  70. int v = e[j].to;
  71. if(scc[v] != scc[i])
  72. in[scc[v]] ++ ;
  73. }
  74. }
  75. ll got = 0;
  76. for(int i = 1;i <= n;++i){
  77. int u = p[i].id;
  78. if(in[scc[u]])
  79. got ++ ,ans += p[i].w,siz[scc[u]] -- ;
  80. else
  81. if(siz[scc[u]] > 1)
  82. got ++ ,ans += p[i].w,siz[scc[u]] -- ;
  83. if(got == k)
  84. break;
  85. }
  86. std::cout<<ans<<std::endl;
  87. }

[yLOI2018] 锦鲤抄的更多相关文章

  1. P5008 [yLOI2018] 锦鲤抄(Tarjan+贪心)

    洛谷 题意: 给出一个有向图,每次可以删除存在入度的点及其出边,每次删除一个点可以获得其权值. 问最终能够获得的最大权值为多少. 思路: 考虑DAG:我们直接倒着拓扑序来选,即可将所有入度不为\(0\ ...

  2. 6.20校内考试整理——大美江湖&&腐草为萤&&锦鲤抄题解

    先安利一下题目作者:一扶苏一 先看第一题: 这道题就是一道简单的模拟题,只要不管一开始的位置,模拟移动与格子对应的触发事件就行了.话不多说,看代码: #include<iostream> ...

  3. zay大爷的神仙题目 D1T3-膜你抄

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

  4. 改编《OI抄》

    最近经历的事情比较多,网上常常流传着<锦鲤抄>修改版,于是就再修改了修改,就能唱起来了. 算是一种情怀吧. 请欣赏: OI抄 作词:某些dar佬 FYHSSGSS ssdfzhyf 作曲: ...

  5. WinterCamp2017吃饭睡觉记

    noip考完后励志好好学习进HE队然后Au,就这样每天勤奋刻苦发愤图强不知不觉就到冬令营了. 除了我之外的大佬们都是以上经历. 我呢……一个很爱浪的蒟蒻. 冬令营到了,伟大的CCF本着报一个录一个的原 ...

  6. [日常]蒟蒻的高一生活 Week 4

    啊啊啊好颓啊...石乐志 (药丸...最近更新的全都是日常了...(果然只做内部题效果滑稽)) 正在考虑把日常部分从科别体改成编日体(什么鬼)反正现在每天都能更新(x OI 整个一周 $dg$ 都没有 ...

  7. 【6.20校内test】

    反正考的不是很好吧,赶脚炸了啊qwq 然后这两天一直在忙一些神奇的事情,所以没有整理完 手动@water_lift T1:大美江湖: [题目背景] 细雪飘落长街,枫叶红透又一年 不只为故友流连,其实我 ...

  8. 校内考试之zay与银临(day1)

    T1大美江湖(洛谷P5006) zayの题解: 这个题的本质是模拟 不过有卡ceil的地方 ceil是对一个double进行向上取整,而对于int/int来说,返回值是int 举个生动的栗子 ceil ...

  9. NIOP 膜你题

    NOIp膜你题   Day1 duliu 出题人:ZAY    1.大美江湖(mzq.cpp/c) [题目背景] 细雪飘落长街,枫叶红透又一年不只为故友流连,其实我也恋长安听门外足音慢,依稀见旧时容颜 ...

随机推荐

  1. LuckySheet一款在线Excel使用心得

    1.LuckySheet简介 Luckysheet ,是一款国产的纯JS实现的类似excel的在线表格,功能强大.配置简单.完全开源. 开源地址 https://gitee.com/mengshuke ...

  2. 详解python三大器——迭代器、生成器、装饰器

    迭代器 聊迭代器前我们要先清楚迭代的概念:通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值). 可迭代对象(i ...

  3. 3.2 Dependencies of the Projects in the Solution 解决方案中项目间的依赖项

    3.2 Dependencies of the Projects in the Solution 解决方案中项目间的依赖项 The diagram below shows the essential ...

  4. Java中的函数式编程(八)流Stream并行编程

    写在前面 在本系列文章的第一篇,我们提到了函数式编程的优点之一是"易于并发编程". Java作为一个多线程的语言,它通过 Stream 来提供了并发编程的便利性. 题外话: 严格来 ...

  5. 2020BUAA软工提问回顾和个人总结作业

    2020BUAA软工提问回顾和个人总结作业 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾和个人总结作业 我在 ...

  6. CentOS 7:快速安装Tomcat7.x

    到官网下载对应的压缩包,CentOS 7的Tomcat下载地址:http://tomcat.apache.org/download-70.cgi,下载后传进服务器中并放在你指定的位置上. 或者使用命令 ...

  7. 并发编程从零开始(十二)-Lock与Condition

    并发编程从零开始(十二)-Lock与Condition 8 Lock与Condition 8.1 互斥锁 8.1.1 锁的可重入性 "可重入锁"是指当一个线程调用 object.l ...

  8. sql server 如何跟更新拼接的数据(cast用法)

    我们在实际中会做如下图的连接 执行以后这个连接就会报错了,如下图所示   然后我们用cast将数字转换为字符串在连接,如下图所示     这次连接的结果就没问题了,如下图所示     最后如果两个数字 ...

  9. 力扣 - 剑指 Offer 58 - I. 翻转单词顺序

    题目 剑指 Offer 58 - I. 翻转单词顺序 思路1 假如题目要求我们翻转字符串,那么我们可以从末尾往前开始遍历每一个字符,同时将每一个字符添加到临时空间,最后输出临时空间的数据就完成翻转了, ...

  10. 【Azure 存储服务】如何把开启NFS 3.0协议的Azure Blob挂载在Linux VM中呢?(NFS: Network File System 网络文件系统)

    问题描述 如何把开启NFS协议的Azure Blob挂载到Linux虚拟机中呢? [答案]:可以使用 NFS 3.0 协议从基于 Linux 的 Azure 虚拟机 (VM) 或在本地运行的 Linu ...