「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. [leetcode]53Maximum Subarray动态规划经典题目:最大子串问题

    /** * Find the contiguous subarray within an array (containing at least one number) * which has the ...

  2. SpringBoot默认首页配置

    @Configuration public class DefaultView extends WebMvcConfigurerAdapter { @Override public void addV ...

  3. android基本组件 Button

    android中提供了普通按钮Buttton和图片按钮ImageButton两种按钮组件,ImageButton按钮中主要有一个android:src属性,用于设置按钮的背景图片.可以在Button的 ...

  4. redis基础-Remote Dictionary Server

    Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念. Redis默认支持16个数据库(可以通过配置文件支持更多,无上限),可以通过配置dat ...

  5. 一言不合就开始搞JDK源码

    ​Java是一门面向对象的编程语言,那什么是面向对象呢,下面将是历史上最通俗易懂的解释了,请看下图: 哈哈,解释的够清楚的了吧.闪. 从源码学编程的好处 学Java编程时,最好同时看一些Java的源码 ...

  6. Tensorflow--------tf.nn库

    1.tf.nn :提供神经网络相关操作,包括卷积神经(conv),池化操作(pooling),归一化,loss,分类操作,embedding,RNN,Evaluation. 2.tf.layers:高 ...

  7. python3 处理列表嵌套字典去重

    def list_dict(dictlist): def function(date): return date['ip'] dictlist_new = [] for list_dict in di ...

  8. 记一次多事件绑定中自己给自己设置的坑——click,dblclick,mousedown,mousemove,mouseup

    目录 项目综述 需求 问题 猜想 解决 反思 项目综述 在页面中模拟某操作系统的操作界面,提供应用窗口的最大化.最小化.还原等功能 需求 对一个应用窗口标题栏双击使其铺满整个视口,再次双击还原到原来大 ...

  9. go mod 拉取私有仓库

    前言 如果代码中依赖了本地的包, 这个包是托管在内网 Gitlab 中, 而且不是 HTTPS 服务,那么应该怎样使用 go mod 拉取代码呢? 本文会给你我的答案 正文 首先我们要知道, 如果本地 ...

  10. 为了加快速度,Redis都做了哪些“变态”设计

    前言 列表对象是 Redis 中 5 种基础数据类型之一,在 Redis 3.2 版本之前,列表对象底层存储结构有两种:linkedlist(双端列表)和 ziplist(压缩列表),而在 Redis ...