题目

题目背景
你在尘世中辗转了千百年,

却只让我看你最后一眼。

火光描摹容颜燃尽了时间,

别留我一人,孑然一身,凋零在梦境里面。

—— 银临 & 云の泣《锦鲤抄》

本题原名《逛庭院》。

这首歌的文案如下:(注:不阅读文案不影响下面的阅读)
宁武皇仁光九年锦文轩刻本《异闻录》载:扶桑画师浅溪,居泰安,喜绘鲤。院前一方荷塘,锦鲤游曳,溪常与嬉戏。

其时正武德之乱,藩镇割据,战事频仍,魑魅魍魉,肆逆于道。兵戈逼泰安,街邻皆逃亡,独溪不舍锦鲤,未去。

是夜,院室倏火。有人入火护溪,言其本鲤中妖,欲取溪命,却生情愫,遂不忍为之。翌日天明,火势渐歇,人已不见。

溪始觉如梦,奔塘边,但见池水干涸,莲叶皆枯,塘中鲤亦不知所踪。

自始至终,未辨眉目,只记襟上层迭莲花,其色魅惑,似血着泪。

后有青岩居士闻之,叹曰:魑祟动情,必作灰飞。犹蛾之投火耳,非愚,乃命数也。

题目描述
扶苏被画师和锦鲤的故事深深地打动了。为了能让锦鲤和画师继续生活在一起,他决定回到着火的庭院中灭掉大火。

画师的庭院可以抽象成一个有向图,每个点代表着一个着火的位置。为了量化火势的大小,扶苏给每个点一个火力值,火力值越大,代表这个点的火势越强。

风助火势,火借风力,对于每一个着火点,都有可能因为大风使得火扩散到其他点。有向图的每条边 <u,v><u,v> 代表大火是从点 uu 扩散到点 vv 的。需要注意的是一个点可能会扩散到很多点,也可能是由很多点的大火一起扩散成的。

为了不因为灭掉火源让画师发现有人在帮他灭火,在任意时刻,扶苏不能灭掉任何一个不被任何点所扩散的点的火。一个点的火被灭掉后,所代表该点的火扩散的所有边将消失。需要说明的是,虽然边消失了,但是该点扩散到的所有点属性除入度以外都不会改变,更不会消失。

因为穿越的时间有限,扶苏只能灭掉最多 kk 个点的火。他想问问你他最多能扑灭多少火力值。

简化版题意:
给你一张有向图,每个点有一个点权。任意时刻你可以任意选择一个有入度的点,获得它的点权并把它和它的出边从图上删去。最多能选择 kk 个点,求最多能获得多少点权。

输入格式
输入的第一行是三个用空格隔开的整数,代表图的点数 nn 和边数 mm 以及点数的限制 kk。

输入的第二行是 nn 个用空格隔开的整数,第 ii 个数 w_iw
i

代表点 ii 的火力值(点权)。

第 33 到第 (m + 2)(m+2) 行,每行两个用空格隔开的整数 u, vu,v,代表一条 uu 指向 vv 的有向边。

输出格式
输出一行一个整数,代表最大的火力值。

输入输出样例
输入 #1复制
7 7 3
10 2 8 4 9 5 7
1 2
1 3
1 4
2 5
3 6
3 7
4 7
输出 #1复制
24
说明/提示
样例输入输出 1 解释
选择 3, 5, 73,5,7 三个节点。

数据规模与约定
本题采用多测试点捆绑测试,共有 55 个子任务。

Subtask 1(30 points):n = 10n=10,m = 50m=50。
Subtask 2(30 points):n = 10^5 + 1n=10
5
+1,m = 5 \times 10^5 + 1m=5×10
5
+1。保证给出的图是一个有向无环图。
Subtask 3(20 points):n = 10^5 + 2n=10
5
+2,m = 5 \times 10^5 + 2m=5×10
5
+2。保证给出的图中,没有入度的点有且仅有一个。
Subtask 4(17 points):n = 10^5 + 3n=10
5
+3,m = 5 \times 10^5 + 3m=5×10
5
+3。
Subtask 5(3 points):n = 5 \times 10^5 + 4n=5×10
5
+4,m = 2 \times 10^6 + 4m=2×10
6
+4。
对于全部的测试点,保证 1 \leq n \leq 5 \times 10^5 + 41≤n≤5×10
5
+4,1 \leq m \leq 2 \times 10^6 + 41≤m≤2×10
6
+4,0 \leq w_i \leq 10^30≤w
i

≤10
3
,0 \leq k \leq n0≤k≤n。

提示
请注意数据读入对程序效率造成的影响。
nn 的末位数字可以帮助你快速的判断测试点所在的子任务。

思路

首先考虑有向无环图怎么做。

有一个贪心的想法,按权值从大到小取,那么我们可以发现除了入度为0的一定取不到以外,总能安排一种顺序使得我们取到想要取的点。

考虑有环的情况:缩点后整张图仍然是一个有向无环图,那么对于一个有入度的强连通分量,发现也能安排一种顺序取完这个强联通分量内所有的点。对于缩完点之后的根节点代表的强联通分量,可以发现总会剩下一个点一定取不到。

那么思路就很清晰了,先缩点,然后拿个堆从大到小取点,如果一个点所在强联通分量没有入度,那么判一下这个强连通分量内是不是只剩它这个点没有取,如果是,则不能取这个点。

代码

#include<bits/stdc++.h>
#define N 2000005
using namespace std;
int n,m,k,c,ans;
int cnt,ls[N];
int dep,top,num,in[N],dfn[N],vis[N],low[N],stk[N],color[N];
struct Graph{int to;int next;
}e[N];
struct Point{int num;int power;
}P[N];
void add(int u,int v){e[cnt].to = v;e[cnt].next = ls[u];ls[u] = cnt++;
}
void tarjan(int x){dfn[x] = low[x] = ++dep; vis[x] = 1; stk[top++] = x;for(int i = ls[x]; ~i; i = e[i].next){if(!dfn[e[i].to]){tarjan(e[i].to);low[x] = min(low[x],low[e[i].to]);}else if(vis[e[i].to])  low[x] = min(low[x],low[e[i].to]);}if(dfn[x] == low[x]){int tmp; num++;do{tmp = stk[--top];color[tmp] = num;vis[tmp] = 0;}while(tmp != x);}
}
bool cmp(const Point &A,const Point &B){return A.power == B.power ? A.num < B.num : A.power < B.power;
}
bool cmp2(const Point &A,const Point &B){return A.power == B.power ? A.num < B.num : A.power > B.power;
}
int main()
{   memset(ls,-1,sizeof(ls));n = read(); m = read(); k = read();for(int i = 1; i <= n; i++)    P[i].power = read(),P[i].num = i;for(int i = 1; i <= m; i++){int u = read(),v = read();add(u,v);}for(int i = 1; i <= n; i++) if(!dfn[i]) tarjan(i);for(int i = 1; i <= n; i++)for(int j = ls[i]; ~j; j = e[j].next)if(color[i] != color[e[j].to]) in[color[e[j].to]]++;sort(P+1,P+n+1,cmp);for(int i = 1; i <= n; i++)if(in[color[P[i].num]] == 0) P[i].power = 0,in[color[P[i].num]] = 1;sort(P+1,P+n+1,cmp2);for(int i = 1; i <= n; i++){c++;ans += P[i].power;if(c == k)  break;}printf("%d",ans);
}

[yLOI2018] 锦鲤抄相关推荐

  1. 【yLOI2018】锦鲤抄

    题面 https://www.luogu.org/problem/P5008 题解 为了带入氛围还把$QQ$音乐里的<锦鲤抄>点开听了听. 让我们想想删除的顺序是什么样子的:最优的顺序一定 ...

  2. 计算机音乐锦鲤抄,锦鲤抄 MIDI File Download :: MidiShow

    Introduction 锦鲤抄midi "锦鲤抄" is a MIDI music piece in Classical Music style, played by Acous ...

  3. P5008-[yLOI2018]锦鲤抄【tarjan】

    正题 题目链接:https://www.luogu.com.cn/problem/P5008 题目大意 给出nnn个点mmm条边的一张有向无环图,你每次可以选择一个有入度的点获取其点权然后删除这个点. ...

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

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

  5. 使用python 定时发送微信信息给喜欢的人

    原创 使用python 定时发送微信信息给喜欢的人 2019-11-08 16:34:18 冒牌技术小哥 阅读数 171 文章标签: python 更多 分类专栏: python 版权声明:本文为博主 ...

  6. 【NOI2022】PV「什么是信息学精神?」

    [NOI2022]PV「什么是信息学精神?」 [NOI2022]PV「什么是信息学精神?」_哔哩哔哩_bilibili [最美教师]徐先友老师:用10年带出一支信息学强队 [最美教师]徐先友老师:用1 ...

  7. 天刀服务器在线人数统计,天刀手游各大区活跃人数统计 神刀削弱后不降反增!...

    随着所有玩家达到90级并且新一轮职业调整之后,各项数据也有了改变.另外随着剑荡的临近,各位大佬也开始逐渐转职等待剑荡,我们看看都有哪些变化! 1.前言 等级封存:少侠们在新版本之前最高只能达到90级满 ...

  8. NOI2019滚粗记

    Day -15 期末考完了,爆炸爆炸,就连数学和物理都错了好多傻*错误QwQ 哎呀管他的,NOI我来了! 跑到广附集训来了23333 Day -14 -- -2 做题,听题,哇和一群队爷在一个教室,真 ...

  9. HTML5CSS3基础:HTML的图片、音频、视频(3)

    该篇文章对图片.音频.视频的格式和常用标签使用作了个简单总结,主要还是说明这三者在html中如何使用. 文章目录 历篇文章目录 第四节:HTML的图片.音频.视频 前言 一.图片 1.格式 2.标签 ...

最新文章

  1. 关于memcached
  2. OpenCV gapi模块基本API的实例(附完整代码)
  3. 【译】Celeste 手感的 10 个设计细节
  4. SAPGUI系统登录页面配置的SAProuter有什么用 1
  5. linux模拟网络延迟,使用Nistnet搭建网络延迟模拟设备 (network delay simulator)
  6. Flutter MaterialApp概述以及主题配置概述
  7. 微信小程序 加载 HTML 标签
  8. Bootstrap 弹出框(Popover)插件
  9. ai png转矢量图_Boxy SVG for Mac(矢量图编辑器)
  10. CMD隐藏黑窗口运行
  11. Java毕设项目大学生旅游拼团网站计算机(附源码+系统+数据库+LW)
  12. 类似Wordpress的建站系统
  13. 淘宝付邮试用Chrome桌面提醒插件(含源码)
  14. Windows 缓冲区溢出与数据执行保护DEP
  15. Android中 手机震动功能的实现
  16. 流量变现的好方法都在这里了!
  17. 3_5.网络文件系统
  18. 枝枝叶梗高傲的顶着莲蓬像是
  19. bzoj 2733 永无岛
  20. Houdini概述——文件管理

热门文章

  1. 2022安全员-C证考试题模拟考试题库模拟考试平台操作
  2. C# WinForm 编写串口调试助手
  3. 自制的 .net framework 强命名工具(支持.net4)
  4. Spark工作原理入门
  5. 2022.04.13 对称二叉树
  6. cadence allegro 的一些经验,小白们大家一起学习上岸(界面基础操作)
  7. 草料二维码必须同一局域网
  8. 华为最美小姐姐被外派墨西哥后...
  9. 吃鱼还是吃肉,国家给出了 8 岁男宝宝的标准身高为 130 厘米、标准体重 27 公斤;8 岁女宝宝的标准身高为 129 厘米、标准体重为 25 公斤。 现在你要根据小宝宝的身高体重,给出补充营养
  10. 【OGG】OGG的下载和安装篇