「CH6101」最优贸易
「CH6101」最优贸易
传送门
考虑一种贪心的思想:我们要尽量买价格小的货物,并尽量高价转卖。
我们记 :
- \(mn[i]\) 为从点 \(1\) 走到点 \(i\) 经过的价格最小的货物的价格。
- \(mx[i]\) 为从点 \(i\) 走到点 \(n\) 经过的价格最大的货物的价格。
这两个东西可以跑两次 \(\text{SPFA}\) 求得。
那么对于任何一个点,如果它位于最优解对应的路径上,那么该最优值一定不会小于 \(mx[i] - mn[i]\)
那么我们就可以把每个点 \(i\) 的 \(mx[i] - mn[i]\) 取最大值,就一定可以取到最优答案。
参考代码:
#include <cstring>
#include <cstdio>
#include <queue>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;
template < class T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while ('0' > c || c > '9') f |= c == '-', c = getchar();
while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
s = f ? -s : s;
}
const int _ = 1e5 + 5, __ = 5e5 + 5;
int tot, head1[_], head2[_], nxt[__ << 2], ver[__ << 2];
inline void Add_edge(int* head, int u, int v)
{ nxt[++tot] = head[u], head[u] = tot, ver[tot] = v; }
int n, m, val[_], mn[_], mx[_], exi[_];
inline void spfa1() {
static queue < int > Q;
while (!Q.empty()) Q.pop();
memset(exi + 1, 0, sizeof (int) * n);
memset(mn + 1, 0x3f, sizeof (int) * n);
Q.push(1), mn[1] = val[1], exi[1] = 1;
while (!Q.empty()) {
int u = Q.front(); Q.pop(), exi[u] = 0;
for (rg int i = head1[u]; i; i = nxt[i]) {
int v = ver[i];
if (mn[v] > min(mn[u], val[v])) {
mn[v] = min(mn[u], val[v]);
if (!exi[v]) exi[v] = 1, Q.push(v);
}
}
}
}
inline void spfa2() {
static queue < int > Q;
while (!Q.empty()) Q.pop();
memset(exi + 1, 0, sizeof (int) * n);
memset(mx + 1, 0, sizeof (int) * n);
Q.push(n), mx[n] = val[n], exi[n] = 1;
while (!Q.empty()) {
int u = Q.front(); Q.pop(), exi[u] = 0;
for (rg int i = head2[u]; i; i = nxt[i]) {
int v = ver[i];
if (mx[v] < max(mx[u], val[v])) {
mx[v] = max(mx[u], val[v]);
if (!exi[v]) exi[v] = 1, Q.push(v);
}
}
}
}
int main() {
#ifndef ONLINE_JUDGE
file("cpp");
#endif
read(n), read(m);
for (rg int i = 1; i <= n; ++i) read(val[i]);
for (rg int u, v, x; m--; ) {
read(u), read(v), read(x);
Add_edge(head1, u, v), Add_edge(head2, v, u);
if (x == 2) Add_edge(head1, v, u), Add_edge(head2, u, v);
}
spfa1(), spfa2();
int ans = 0;
for (rg int i = 1; i <= n; ++i) ans = max(ans, mx[i] - mn[i]);
printf("%d\n", ans);
return 0;
}
「CH6101」最优贸易的更多相关文章
- 「NOIP2009」最优贸易 题解
「NOIP2009」最优贸易 题解 题目TP门 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 ...
- 「NOIP2009」最优贸易
「NOIP2009」最优贸易 「NOIP2009」最优贸易内存限制:128 MiB时间限制:1000 ms 题目描述C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意 ...
- #2590. 「NOIP2009」最优贸易
C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道 ...
- CH6101 最优贸易【最短路】
6101 最优贸易 0x60「图论」例题 描述 C国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通 ...
- loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点
loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...
- 「2014-3-18」multi-pattern string match using aho-corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
- jvm系列(十):如何优化Java GC「译」
本文由CrowHawk翻译,是Java GC调优的经典佳作. 本文翻译自Sangmin Lee发表在Cubrid上的"Become a Java GC Expert"系列文章的第三 ...
- 一个「学渣」从零开始的Web前端自学之路
从 13 年专科毕业开始,一路跌跌撞撞走了很多弯路,做过餐厅服务员,进过工厂干过流水线,做过客服,干过电话销售可以说经历相当的“丰富”. 最后的机缘巧合下,走上了前端开发之路,作为一个非计算机专业且低 ...
- Loj #3059. 「HNOI2019」序列
Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...
随机推荐
- HDU4081 Qin Shi Huang's National Road System
先求最小生成树 再遍历每一对顶点,如果该顶点之间的边属于最小生成树,则剪掉这对顶点在最小生成树里的最长路径 否则直接剪掉连接这对顶点的边~ 用prim算法求最小生成树最长路径的模板~ #include ...
- django中的session,cookie
https://blog.csdn.net/chen1042246612/article/details/84327046 https://www.imooc.com/wenda/detail/396 ...
- springboot笔记-1.自动化配置的关键
最近发现看过的东西容易忘,但是写一遍之后印象倒是会深刻的多. 总所周知springboot极大的简化了java开发繁琐性,而其最大的优势应该就是自动化配置了.比如要使用redis,我们直接引入相关的包 ...
- Oracle 分析函数 over
最近在做一个OA系统的统计模块,里面有个功能需要统计出每天新增的用户和累计新增的用户, 只有一张 用户登录的表(用户登录时间,用户ID,等等),效果图: 分析:1,同一用户在一天之内可以登录多次,在这 ...
- lucky 的 时光助理(3)
今天lucky小姐哭笑不得的说, 昨天下班时跟经理一起走的时候, 地铁站手机被小偷偷走,那时一个人孤单单的,除了惊愕, 她不知道该去联系谁, 借了同事的手机,给家里打去电话. 她说,因为那是她唯一记得 ...
- 最长公共子序列-Hdu1159
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- C:变量的声明与定义
声明变量不需要建立存储空间,如:extern int a; 定义变量需要建立存储空间,如:int b; #include <stdio.h> int main() { //extern 关 ...
- tkinter学习(3)scale尺度条和menu菜单
1.scale学习(尺度条)1.1 代码: #第1步:导出模块 import tkinter as tk #第2步:定义窗口,及其标题.大小和位置 win = tk.Tk() win.title('s ...
- python3.8+PySimpleGUI+进度条代码大全
1.python3.8+PySimpleGUI+进度条大全 2.效果图: 3.代码: #导出模块 import PySimpleGUI as sg import time import inspect ...
- 很重要的C++的位运算bitset
本文摘录于柳神笔记: bitset ⽤来处理⼆进制位⾮常⽅便.头⽂件是 #include , bitset 可能在PAT.蓝桥OJ中不常 ⽤,但是在LeetCode OJ中经常⽤到-⽽且知道 bits ...