「LYOI2018 Summer」Hzy's Rabbit Candy

题目描述

Hzy 和她的 m 只兔兔在一个 n 个点 m 条边的有向无环图上玩。

为了让兔兔们开心,Hzy 带了一些糖。Hzy 可以从任何一个点开始,走到任何一个点结束。在这途中,每当 Hzy 经过一个点 i,她会捡到 a_i 块糖;每当 Hzy 经过一条边 j,这条边上的兔兔会吃掉她的 b_j块糖。

Hzy 希望能在结束时保留尽量少的糖,请求出 Hzy 在结束时的糖的数量相对于开始时的糖的数量最多减少多少(请注意,Hzy 的糖可能无论如何都无法减少,此时答案是一个非正整数)。

输入格式

第一行两个正整数 n、m,表示点数和边数。
之后的一行 n 个正整数以空格隔开,第 i 个正整数 aia_ia​i​​ 表示经过第 iii 个点 Hzy 会捡到的糖的数量。
之后的 m 行,每行三个正整数 uj,vj,bj表示一条从 u_j 到 v_j的边,Hzy 经过这条边时,兔兔会吃掉 b_j块糖。

输出格式

一行一个正整数,表示 Hzy 在结束时的糖的数量相对于开始时的糖的数量最多减少多少。

样例输入

3 5
1 2 3
1 2 10
1 2 11
2 3 10
2 3 11
1 3 15

样例输出

16

题目链接 :https://ly.men.ci/problem/398


思路:dp+拓扑排序
实现工具:邻接表
邻接表不会的戳这---->https://www.cnblogs.com/ECJTUACM-873284962/p/6905416.html
 1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<queue>
5 using namespace std;
6
7 struct edge{
8 int s,t,next,wi;
9 }edge[500007];
10
11 long long ans=-100000000;
12 int cnt,head[100007]; //head[u]表示u边的序列号
13 int k[100007] ; // k[i]表示第i个节点所获得的糖果数
14 int in[100007]; //in[i]可以成为边的点 和到它的入度数
15 long long f[100007];
16 void add(int u,int v,int w){ //邻接表
17 cnt++;
18 edge[cnt].s=u;
19 edge[cnt].t=v;
20 edge[cnt].wi=w;
21 edge[cnt].next=head[u]; //next表示u边的上个序列号
22 head[u]=cnt; //这时在标记当前边的序号,比较优秀的方法
23
24 }
25 int main(){
26 int n,m;
27 cin>>n>>m;
28 int vi;
29 for(int i=1;i<=n;i++){
30 cin>>vi;
31 k[i]=vi*(-1); //因为在这道题中求失去的最大值,所以获得就相当于加个负数
32 f[i]=k[i];
33 ans=max(ans,f[i]); //题面说从任意一点开始到任一点结束,so我们不妨从最大的点开始之后不断更新答案
34 } for(int i=1;i<=m;i++){
35
36 int u,v,w;
37 cin>>u>>v>>w;
38 add(u,v,w);
39 in[v]++; //因为以v的点都是可以成边的点
40 //将这些点打上标记 ,入度+1
41 }
42 queue<int> q;
43 for(int i=1;i<=n;i++){
44 if(!in[i])q.push(i); //这样队列中的点都是有边的
45 }
46
47 //开始拓扑排序啦
48 while(!q.empty()){
49 int u=q.front();
50 q.pop();
51 for(int i=head[u];i;i=edge[i].next){
52 int v=edge[i].t;
53 long long v1=f[u]+edge[i].wi+k[v];
54 f[v]=max(f[v],v1); //dp,对于当前这个点来说选与不选的价值
55 ans=max(ans,f[v]); //ans更新答案
56 in[v]--;//in数组的作用在这里还有将其入度-1;
57 if(!in[v])q.push(v); //一开始我们是将循环的每个点都pop出去了,但是这个点目前还有入度,所以我们还得将它压进队列
58 }
59 }
60 cout<<ans<<endl;
61 return 0;
62 }
63

「LYOI2018 Summer」Hzy's Rabbit Candy----拓扑排序问题的更多相关文章

  1. 「Usaco2012 Dec」第一(字典树+拓扑排序)

    (我恨字符串) 惯例化简题目:给定n个字符串,可以改变字符的相对大小(在字典序中的大小),问:字符串i是否能成为最小的字符串(字典序) 解题过程: 首先你可以预处理出来26的全排列然后暴力然后你只要用 ...

  2. 前端构建工具之gulp(一)「图片压缩」

    前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...

  3. fir.im Weekly - 如何打造 Github 「爆款」开源项目

    最近 Android 转用 Swift 的传闻甚嚣尘上,Swift 的 Github 主页上已经有了一次 merge>>「Port to Android」,让我们对 Swift 的想象又多 ...

  4. 更新日志 - fir.im「高级统计」功能上线

    距离 2016 年到来只剩 10 个日夜,fir.im 也准备了一些新鲜的东西,比如「高级统计」功能和「跳转应用商店」功能,帮助你更好地管理.优化应用,欢迎大家试用反馈:) 新增高级统计功能 这次更新 ...

  5. Notepad++ 开启「切分窗口」同时检视、比对两份文件

    Notepad++ 是个相当好用的免费纯文本编辑器,除了内建的功能相当多之外,也支持外挂模块的方式扩充各方面的应用.以前我都用 UltraEdit 跟 Emeditor,后来都改用免费的 Notepa ...

  6. 「zigbee - 1」工欲善其事必先利其器 - IAR for 8051 IDE customization

    最近在实验室做一些 Zigbee 相关的事情,然而一直没在博客上记录啥东西,也不像原来在公司有动力在 Confluence wiki 上扯东扯西.直到前些阵子,跑到 feibit 论坛上(国内较大的一 ...

  7. 「C语言」文件的概念与简单数据流的读写函数

    写完「C语言」单链表/双向链表的建立/遍历/插入/删除 后,如何将内存中的链表信息及时的保存到文件中,又能够及时的从文件中读取出来进行处理,便需要用到”文件“的相关知识点进行文件的输入.输出. 其实, ...

  8. 「C语言」Windows+EclipseCDT下的C语言开发环境准备

    之前写过一篇 「C语言」在Windows平台搭建C语言开发环境的多种方式 ,讨论了如何在Windows下用DEV C++.EclipseCDT.VisualStudio.Sublime Test.Cl ...

  9. 如何对抗 WhatsApp「蓝色双勾」-- 3 个方法让你偷偷看讯息

    WhatsApp 强制推出新功能「蓝色双勾 (✔✔)」 ,让对方知道你已经看过讯息.一众用户反应极大,因为以后不能再藉口说未看到讯息而不回覆.究竟以后 WhatsApp 是否真的「更难用」? 幸好还有 ...

随机推荐

  1. 【JDBC核心】实现 CRUD 操作

    实现 CRUD 操作 操作和访问数据库 数据库连接被用于向数据库服务器发送命令和 SQL 语句,并接受数据库服务器返回的结果.其实一个数据库连接就是一个 Socket 连接. java.sql 包中有 ...

  2. 【Redis3.0.x】配置文件

    Redis3.0.x 配置文件 概述 Redis 的配置文件位于Redis安装目录下,文件名为 redis.conf. 可以通过 CONFIG 命令查看或设置配置项. Redis 命令不区分大小写. ...

  3. 【C++】《C++ Primer 》第八章

    第八章 IO库 一.IO类 1. 标准库定义的IO类型 头文件 作用 类型 iostream 从标准流中读写数据 istream, wistream 从流读取数据 ostream, wostream ...

  4. C中的dll 、lib和exe文件

    参考:链接1   链接2 DLL 动态链接库(Dynamic Link Library,缩写为DLL),运行时加载是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源.动态链接 ...

  5. Kafka底层原理剖析(近万字建议收藏)

    Kafka 简介 Apache Kafka 是一个分布式发布-订阅消息系统.是大数据领域消息队列中唯一的王者.最初由 linkedin 公司使用 scala 语言开发,在2010年贡献给了Apache ...

  6. 攻防世界—pwn—level2

    题目分析 题目提示 下载文件后首先使用checksec检查文件保护机制 使用ida打开,查看伪代码 搜索字符串发现/bash/sh 信息收集 偏移量 system的地址 /bin/sh的地址 编写脚本 ...

  7. LuoguP5748 集合划分计数

    题意 一个有\(n\)个元素的集合,将其分为任意个非空子集,求方案数.集合之间是无序的,\(\{\{1,2\},\{3\}\}=\{\{3\},\{1,2\}\}\). 设\(f_n\)表示用\(n\ ...

  8. 处理 K8S Orphaned pod found - but volume paths are still present on disk 孤儿pod

    问题概述 查看kubelet或/var/log/messages日志一直包错,发现是孤儿pod,是由于其pod被删除后存储路径还保存在磁盘. 报错如下 [root@node5 ~]# journalc ...

  9. Python赋值、浅复制和深复制

    Python赋值.浅复制和深复制 ​ 首先我们需要知道赋值和浅复制的区别: 赋值和浅复制的区别 赋值,当一个对象赋值给另一个新的变量时,赋的其实是该对象在栈中的地址,该地址指向堆中的数据.即赋值后,两 ...

  10. uni-app请求uni.request封装使用

    对uni.request的一些共同参数进行简单的封装,减少重复性数据请求代码.方便全局调用. 先在目录下创建 utils 和 common 这2个文件夹 utils 是存放工具类的,common 用来 ...