洛谷

题意:

给出一个有向图,每次可以删除存在入度的点及其出边,每次删除一个点可以获得其权值。

问最终能够获得的最大权值为多少。

思路:

考虑DAG:我们直接倒着拓扑序来选,即可将所有入度不为\(0\)的点选完。

若不为DAG,考虑\(tarjan\)求出强连通分量,分析可以发现:对于一个单独的强连通分量,假设其点数为\(n\),那么可以选择\(n-1\)个点;若其入度不为\(0\),那么强连通分量中所有点都可以选择。

然后直接这样来搞就行。

证明...我也不会,在纸上画画就行了。

  1. #include <bits/stdc++.h>
  2. #define MP make_pair
  3. #define fi first
  4. #define se second
  5. #define sz(x) (int)(x).size()
  6. #define all(x) (x).begin(), (x).end()
  7. #define INF 0x3f3f3f3f
  8. // #define Local
  9. #ifdef Local
  10. #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
  11. void err() { std::cout << '\n'; }
  12. template<typename T, typename...Args>
  13. void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
  14. #else
  15. #define dbg(...)
  16. #endif
  17. void pt() {std::cout << '\n'; }
  18. template<typename T, typename...Args>
  19. void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
  20. using namespace std;
  21. typedef long long ll;
  22. typedef pair<int, int> pii;
  23. //head
  24. const int N = 5e5 + 5, M = 2e6 + 5;
  25. struct Edge{
  26. int v, next;
  27. }e[M];
  28. int a[N];
  29. int head[N], tot;
  30. void adde(int u, int v) {
  31. e[tot].v = v; e[tot].next = head[u]; head[u] = tot++;
  32. }
  33. int n, m, k;
  34. pii E[M];
  35. stack <int> s;
  36. int T, num;
  37. int col[N], dfn[N], low[N], Min[N];
  38. bool chk[N];
  39. void Tarjan(int u){
  40. dfn[u] = low[u] = ++T;
  41. s.push(u);
  42. for(int i = head[u]; i != -1;i = e[i].next){
  43. int v = e[i].v;
  44. if(!dfn[v]){
  45. Tarjan(v);
  46. low[u] = min(low[u], low[v]);
  47. }else if(!col[v]){
  48. low[u] = min(low[u], dfn[v]);
  49. }
  50. }
  51. if(low[u] == dfn[u]){
  52. num++; int now;
  53. do{
  54. now = s.top(); s.pop();
  55. col[now] = num;
  56. Min[num] = min(Min[num], a[now]);
  57. }while(!s.empty() && now!=u);
  58. }
  59. }
  60. int in[N];
  61. void run() {
  62. cin >> n >> m >> k;
  63. memset(head, -1, sizeof(head)); tot = 0;
  64. memset(Min, INF, sizeof(Min));
  65. ll ans = 0;
  66. for(int i = 1; i <= n; i++) cin >> a[i];
  67. for(int i = 1; i <= m; i++) {
  68. int u, v; cin >> u >> v;
  69. E[i] = MP(u, v);
  70. adde(u, v);
  71. }
  72. for(int i = 1; i <= n; i++) {
  73. if(!dfn[i]) Tarjan(i);
  74. }
  75. for(int i = 1; i <= m; i++) {
  76. int u = E[i].fi, v = E[i].se;
  77. if(col[u] != col[v]) ++in[col[v]];
  78. }
  79. for(int i = 1; i <= n; i++) {
  80. int bel = col[i];
  81. if(a[i] == Min[bel] && in[bel] == 0) {
  82. if(!chk[bel]) {
  83. chk[bel] = 1;
  84. a[i] = 0;
  85. }
  86. }
  87. }
  88. sort(a + 1, a + n + 1); reverse(a + 1, a + n + 1);
  89. for(int i = 1; i <= k; i++) ans += a[i];
  90. pt(ans);
  91. }
  92. int main() {
  93. ios::sync_with_stdio(false);
  94. cin.tie(0); cout.tie(0);
  95. cout << fixed << setprecision(20);
  96. #ifdef Local
  97. freopen("../input.in", "r", stdin);
  98. freopen("../output.out", "w", stdout);
  99. #endif
  100. run();
  101. return 0;
  102. }

P5008 [yLOI2018] 锦鲤抄(Tarjan+贪心)的更多相关文章

  1. [yLOI2018] 锦鲤抄

    先思考图上是\(tag\)的特殊情况. 考虑我们按拓扑序反过来操作,就可以得到我们任意想要的顺序. 那么我们把所有的图都缩点操作,那么我们只需要考虑一个联通分量里就行了. 一个联通分量最后只会剩下一个 ...

  2. 【洛谷P5008 逛庭院】tarjan缩点+贪心

    既然没有题解,那么我就来提供给一份. -- 首先我们看到数据范围.妈耶!数据这么大,一开始还想用个DP来做,但是看着就不行,那么根据这个数据范围,我们大致可以猜到这道题的算法是一个贪心,那么我们怎么贪 ...

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

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

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

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

  5. 改编《OI抄》

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

  6. 洛谷P5234 越狱老虎桥 [JSOI2012] tarjan

    正解:tarjan+贪心(?并不会总结是什么方法QAQ,,, 解题报告: 传送门! 这题是真的题意杀,,,我我我要不是之前知道题目大意了我怕是怎么看都看不懂这是个什么意思昂QAQ 所以先说下题目大意好 ...

  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. 如何在Windows系统上基于Sublime搭建Python的编译环境

    刚刚接触到Python,直接在计算机上编译时不能正确的运行,所以将一些有关编译环境调试的知识总结了一下. 环境搭建: Python在 windows系统上编译的时候可能会出现一些编译无法运行的情况,我 ...

  2. Pwnable-cmd1

    ssh cmd1@pwnable.kr -p2222 (pw:guest) 先看一下c的源码 #include <stdio.h> #include <string.h> in ...

  3. Linux上发布E卡通项目

    Linux上发布E卡通项目 使用的命令 ps -ef | grep java kill -9 22314 nohup java -jar smartcard-ms-0.0.1-SNAPSHOT.jar ...

  4. 对象锁和class锁

    对象锁:就是这个锁属于这个类的对象实例,可以通过为类中的非静态方法加synchronized关键字 或者使用 synchronized(this) 代码块,为程序加对象锁. Class锁:就是这个锁属 ...

  5. LG4824 「USACO2015FEB」(Silver)Censoring KMP+栈

    问题描述 LG4824 题解 大概需要回顾(看了题解) KMP 先对要删除的 模式串 进行自我匹配,求出 \(\mathrm{fail}\) 然后再扫 文本串 的过程中记录一下每个字符匹配的最大长度, ...

  6. APP兼容性测试 (一) 机型选择概要

    一.App兼容性问题有哪些 安装失败.启动失败.卸载失败,卸载不干净. 程序运行过程中闪退 部分控件显示不完整或者功能失效 屏幕显示异常 图片展示不全等 二.App兼容性测试的核心要点 测试软件是否能 ...

  7. git同步本地数据到github——第一次使用和以后使用

    git作为版本控制工具十分的好用,但是在使用的过程中,会因为仓库版本的不同步出现很多错误 一.git简单的原理交互模型 从下面的model中我们看到在不创建分支情况下始终是远程的origin和本地的m ...

  8. 使用SolrJ客户端管理SolrCloud(Solr集群)

    1.使用SolrJ客户端管理SolrCloud(Solr集群). package com.taotao.search.service; import java.io.IOException; impo ...

  9. 练手WPF(四)——贪吃蛇小游戏的简易实现(上)

    一. 游戏界面首先,按照惯例,编辑MainWindow.xaml,先将游戏界面制作好.非常简单:(1)主游戏区依然使用我们熟悉的Canvas控件,大小为640X480像素,设定每小格子为20px,所以 ...

  10. 腾讯云-ASP.NET Core+Mysql+Jexus+CDN上云实践

    腾讯云-ASP.NET Core+Mysql+Jexus+CDN上云实践.md 开通腾讯云服务器和Mysql 知识点: ASP.NET Core和 Entity Framework Core的使用 L ...