「NOIP2009」最优贸易

「NOIP2009」最优贸易
内存限制:128 MiB时间限制:1000 ms

题目描述
C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为 1 条。

C 国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同。但是,同一种商品在同一个城市的买入价和卖出价始终是相同的。

商人阿龙来到 C 国旅游。当他得知同一种商品在不同城市的价格可能会不同这一信息之后,便决定在旅游的同时,利用商品在不同城市中的差价赚回一点旅费。设 C 国 n 个城市的标号从 1∼n,阿龙决定从 1 号城市出发,并最终在 n 号城市结束自己的旅行。在旅游的过程中,任何城市可以重复经过多次,但不要求经过所有 n 个城市。

阿龙通过这样的贸易方式赚取旅费:他会选择一个经过的城市买入他最喜欢的商品——水晶球,并在之后经过的另一个城市卖出这个水晶球,用赚取的差价当做旅费。由于阿龙主要是来 C 国旅游,他决定这个贸易只进行最多一次,当然,在赚不到差价的情况下他就无需进行贸易。

假设 C 国有 5 个大城市,城市的编号和道路连接情况如下图,单向箭头表示这条道路为单向通行,双向箭头表示这条道路为双向通行。

27.png

假设 1 ~ n 号城市的水晶球价格分别为 4,3,5,6,1 。

阿龙可以选择如下一条线路:1→2→3→5,并在 2 号城市以 3 的价格买入水晶球,在 3 号城市以 5 的价格卖出水晶球,赚取的旅费数为 2 。

阿龙也可以选择如下一条线路 1→4→5→4→5,并在第 1 次到达 5 号城市时以 1 的价格买入水晶球,在第 2 次到达 4 号城市时以 6 的价格卖出水晶球,赚取的旅费数为 5 。

现在给出 n 个城市的水晶球价格, m 条道路的信息(每条道路所连接的两个城市的编号以及该条道路的通行情况)。请你告诉阿龙,他最多能赚取多少旅费。

输入格式
输入第一行包含 2 个正整数 n 和 m,中间用一个空格隔开,分别表示城市的数目和道路的数目。

第二行 n 个正整数,每两个整数之间用一个空格隔开,按标号顺序分别表示这 n 个城市的商品价格。

接下来 m 行,每行有 3 个正整数, x,y,z ,每两个整数之间用一个空格隔开。如果 z=1,表示这条道路是城市 x 到城市 y 之间的单向道路;如果 z=2,表示这条道路为城市 x 和城市 y 之间的双向道路。

输出格式
输出共 1 行,包含 1 个整数,表示最多能赚取的旅费。如果没有进行贸易,则输出 0 。

样例
5 5
4 3 5 6 1
1 2 1
1 4 1
2 3 2
3 5 1
4 5 2
样例输出
5
数据范围与提示
输入数据保证 1 号城市可以到达 n 号城市。

对于10% 的数据,n≤6;

对于30% 的数据,n≤100;

对于50% 的数据,不存在一条旅游路线,可以从一个城市出发,再回到这个城市;

对于100% 的数据,1≤n≤100,000,1≤m≤500,000,1≤x,y≤n,1≤z≤2,1≤各城市水晶球价格≤100。

-------------------------------------------------------------------------------------------------------------------------------

NOIp2009的题目。

就是求有向图中从x点向前的最小值和向后的最大值。然后求出差值,并求出插值中的最大值就是答案。

用到了类似SPFA的思想。但是要注意更新值的条件。

-------------------------------------------------------------------------------------------------------------------------------

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=1e5+10;
4 const int maxm=5e5+10;
5 int n,m;
6 int w[maxn];
7 struct edge
8 {
9 int u,v,nxt;
10 }e[maxm<<1],ee[maxm<<1];
11 int head[maxn],js,headd[maxm<<1],jss;
12 void addage(int u,int v)
13 {
14 e[++js].u=u;e[js].v=v;
15 e[js].nxt=head[u];head[u]=js;
16 }
17 void addagee(int u,int v)
18 {
19 ee[++jss].u=u;ee[jss].v=v;
20 ee[jss].nxt=headd[u];headd[u]=jss;
21 }
22 int fmn[maxn],fmx[maxn];
23 bool inq[maxn];
24 void findmn(int x)
25 {
26 inq[x]=1;
27 for(int i=1;i<=n;++i)fmn[i]=0x7fffffff;
28 fmn[x]=w[x];
29 queue<int>q;
30 q.push(x);
31 while(!q.empty())
32 {
33 int u=q.front();
34 q.pop();inq[u]=0;
35 for(int i=head[u];i;i=e[i].nxt)
36 {
37 int v=e[i].v;
38 if(fmn[v]>fmn[u] || fmn[v]>w[v])
39 {
40 fmn[v]=min(fmn[u],w[v]);
41 if(!inq[v])
42 {
43 inq[v]=1;
44 q.push(v);
45 }
46 }
47 }
48 }
49 }
50 void findmx(int x)
51 {
52 inq[x]=1;
53 for(int i=1;i<=n;++i)fmx[i]=0;
54 fmx[x]=w[x];
55 queue<int>q;
56 q.push(x);
57 while(!q.empty())
58 {
59 int u=q.front();
60 q.pop();inq[u]=0;
61 for(int i=headd[u];i;i=ee[i].nxt)
62 {
63 int v=ee[i].v;
64 if(fmx[v]<fmx[u] || fmx[v]<w[v])
65 {
66 fmx[v]=max(fmx[u],w[v]);
67 if(!inq[v])
68 {
69 inq[v]=1;
70 q.push(v);
71 }
72 }
73 }
74 }
75 }
76 int main()
77 {
78 scanf("%d%d",&n,&m);
79 for(int i=1;i<=n;++i)scanf("%d",w+i);
80 for(int u,v,op,i=0;i<m;++i)
81 {
82 scanf("%d%d%d",&u,&v,&op);
83 addage(u,v);addagee(v,u);
84 if(op==2)addage(v,u),addagee(u,v);
85 }
86 findmn(1);
87 findmx(n);
88 int ans=0;
89 for(int i=1;i<=n;++i)ans=max(ans,fmx[i]-fmn[i]);
90 cout<<ans;
91 return 0;
92 }

「NOIP2009」最优贸易的更多相关文章

  1. 「NOIP2009」最优贸易 题解

    「NOIP2009」最优贸易 题解 题目TP门 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 ...

  2. #2590. 「NOIP2009」最优贸易

    C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道 ...

  3. 「CH6101」最优贸易

    「CH6101」最优贸易 传送门 考虑一种贪心的思想:我们要尽量买价格小的货物,并尽量高价转卖. 我们记 : \(mn[i]\) 为从点 \(1\) 走到点 \(i\) 经过的价格最小的货物的价格. ...

  4. 「NOIP2009」Hankson 的趣味题

    Hankson 的趣味题 [内存限制:$128 MiB$][时间限制:$1000 ms$] [标准输入输出][题目类型:传统][评测方式:文本比较] 题目描述 Hanks 博士是 BT(Bio-Tec ...

  5. 【NOIP2009】最优贸易

    描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通 ...

  6. NOIP2009 压轴---最优贸易

    链接:https://ac.nowcoder.com/acm/contest/959/H来源:牛客网 C国有n个大城市和m条道路,每条道路连接这n个城市中的某两个城市.任意两个城市之间最多只有一条道路 ...

  7. [NOIP2009][LuoguP1073] 最优贸易 - Tarjan,拓扑+DP

    Description&Data 题面:https://www.luogu.org/problemnew/show/P1073 Solution Tarjan对联通块缩点,在DAG上按照拓扑序 ...

  8. NOIP2009 t3 最优贸易

    题目传送门:洛谷P1073 dalao们都用的tarjan啊拓扑排序啊之类的玩意儿,我这个蒟蒻不会,只想到了极其暴力的分层图最短路 设三个状态 0表示没有发生任何买卖的情况 1表示买了没有卖的情况 2 ...

  9. loj2589 「NOIP2009」Hankson 的趣味题

    对于质因数分解理解还不到位. 此题可知$lcm$是$x$的倍数,$x$是$lcm$的约数,只要在$lcm$的分解质因数里对每一个质因子讨论种数即可. 具体来说,对于$lcm$的一个质因子$p$,讨论$ ...

随机推荐

  1. JAVA_JNI字段描述符“([Ljava/lang/String;)V”(Android)

    JNI字段描述符"([Ljava/lang/String;)V "([Ljava/lang/String;)V" 它是一种对函数返回值和参数的编码.这种编码叫做JNI字段 ...

  2. python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (二)

    Hey! 如果你还没有看这篇的上文的话,可以去稍稍瞅一眼,会帮助加速理解这一篇里面涉及到的递归结构哦!(上一篇点这里:<python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (一)> ...

  3. 解决使用Navicat等工具进行连接登录mysql的1521错误,(mysql为8.0版本)

    mysql 8.0的版本的加密方式和以前的不一样,因此使用Navicat等工具进行连接的时候,会报1521的异常. 解决方法如下: 登录mysql的命令行工具,输入如下代码: ALTER USER ' ...

  4. NOIP初赛篇——05计算机语言

    程序 ​ 程序就是一系列的操作步骤,计算机程序就是由人实现规定的计算机完成某项工作的操作步骤.每一步骤的具体内容能够理解的指令来描述,这些指令告诉计算机"做什么"和"怎么 ...

  5. 在微信小程序开发中使用Typescript

    Typescript的优势咱不需要赘述太多,有兴趣可以参考(https://www.typescriptlang.org/).今天给大家分享一下如何在微信小程序(或者其他同类小程序)开发中使用Type ...

  6. HAProxy + keepalived 高可用集群代理

    HAProxy + keepalived # 1 安装keepalived: yum install keepalived -y # 2 修改KEEPalived配置文件: vim /etc/keep ...

  7. 【JS学习】for-in与for-of

    前言:本博客系列为学习后盾人js教程过程中的记录与产出,如果对你有帮助,欢迎关注,点赞,分享.不足之处也欢迎指正,作者会积极思考与改正. 总述: 名称 遍历 适用 for-in 索引 主要建议白能力对 ...

  8. scaffoldingTools

    脚手架工具 脚手架工具概要(前端工程化的发起者) 脚手架的本质作用:创建项目基础架构.提供项目规范和约定 相同的组织结构 相同的开发规范 相同的模块依赖 相同的工具配置 相同的基础代码 举例:IDE创 ...

  9. 【EXPDP/IMPDP】ORACLE数据泵导入导出案例(expdp & impdp)

    概要: 因项目需要,通常需要将生产库下的部分数据抽取并恢复到测试库上 本文主要介绍数据泵导入导出的几种情况以及错误处理 案例环境: rhel-server-6.5-x86_64 oracle 11.2 ...

  10. Upload - Labs (下)

    Pass - 11: 1.查看源代码,发现进行了一次对后缀名替换成空格,因此考虑双写绕过, 2.上传成功, 关键代码: $is_upload = false; $msg = null; if (iss ...