CH6101 最优贸易

2024-08-23 16:08
文章标签 最优 贸易 ch6101

本文主要是介绍CH6101 最优贸易,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

描述

C国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为1条。
C国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同。但是,同一种商品在同一个城市的买入价和卖出价始终是相同的。
商人阿龙来到C国旅游。当他得知“同一种商品在不同城市的价格可能会不同”这一信息之后,便决定在旅游的同时,利用商品在不同城市中的差价赚一点旅费。设C国 n 个城市的标号从 1~n,阿龙决定从1号城市出发,并最终在 n 号城市结束自己的旅行。在旅游的过程中,任何城市可以被重复经过多次,但不要求经过所有 n 个城市。
阿龙通过这样的贸易方式赚取旅费:他会选择一个经过的城市买入他最喜欢的商品——水晶球,并在之后经过的另一个城市卖出这个水晶球,用赚取的差价当做旅费。因为阿龙主要是来C国旅游,他决定这个贸易只进行最多一次,当然,在赚不到差价的情况下他就无需进行贸易。
现在给出 n 个城市的水晶球价格,m 条道路的信息(每条道路所连接的两个城市的编号以及该条道路的通行情况)。请你告诉阿龙,他最多能赚取多少旅费。

输入格式

   第一行包含 2 个正整数n 和m,中间用一个空格隔开,分别表示城市的数目和道路的
数目。
   第二行 n 个正整数,每两个整数之间用一个空格隔开,按标号顺序分别表示这n 个城
市的商品价格。
   接下来 m 行,每行有3 个正整数,x,y,z,每两个整数之间用一个空格隔开。如果z=1,表示这条道路是城市x 到城市y 之间的单向道路;如果z=2,表示这条道路为城市x 和城市y 之间的双向道路

输出格式

一个整数,表示答案。

样例输入

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%的数据,1≤n≤6。
    对于 30%的数据,1≤n≤100。
    对于 50%的数据,不存在一条旅游路线,可以从一个城市出发,再回到这个城市。
    对于 100%的数据,1≤n≤100000,1≤m≤500000,1≤x,y≤n,1≤z≤2,1≤各城市
    水晶球价格≤100。

测试地址:CH6101


如果题意莫名其妙,那么莫名其妙的不是出题人的脑袋就是我们的脑袋。——zrt

个人思路:

  • 注意到进行最多一次最多能赚取和输入格式,可以考虑一下单源最短路径。
  • 假设我们是阿龙 的话,当然会在路径上选择最便宜的地方买物品,最贵的地方售出物品。
  • 如果对Dijkstra的更新方式进行修改,就可以求出从源点到每一个点购入的最便宜价格。(对Dijkstra的理解)
  • 形象地说,我们如果是阿龙的话,等于尝试走到每个点,并看从源点到每个点时,能购入的最便宜价格。
  • 到这里,就有一个小技巧了。既然求得购入价格可以正着走,那么是否求售出价格可以反着走呢?
  • 答案是可以的。
  • 最终,进行两次Dijkstra,再枚举ans=max(售出价格[i]-购入价格[i])即可求出答案。注意,第二次Dijkstra要求进行在反图上。

#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
const int MAXN=1000010,MAXM=1000010;
int n;
struct Edge_Low{int from,to,nxt;
}e_Low[MAXM];
int head_Low[MAXN],edgeCnt_Low=0;
void addEdge_Low(int u,int v){e_Low[++edgeCnt_Low].from=u;e_Low[edgeCnt_Low].to=v;e_Low[edgeCnt_Low].nxt=head_Low[u];head_Low[u]=edgeCnt_Low;
}
int price[MAXN];//各个点的价格 
const int INF=2100000000;
struct Node{int nowPoint,nowValue;bool operator <(const Node &a)const{return a.nowValue<nowValue;}
};
int s_Low;
int dis_Low[MAXN];
void dijkstra_Low(){//收购尽量低价 for(int i=1;i<=n;i++)dis_Low[i]=INF;priority_queue<Node> q;q.push(Node{s_Low,price[s_Low]});dis_Low[s_Low]=price[s_Low];while(!q.empty()){Node nowNode=q.top();q.pop();int nowPoint=nowNode.nowPoint,nowValue=nowNode.nowValue;if(dis_Low[nowPoint]!=nowValue)continue;for(int i=head_Low[nowPoint];i;i=e_Low[i].nxt){int nowV=e_Low[i].to;if(dis_Low[nowV]>dis_Low[nowPoint]){dis_Low[nowV]=min(dis_Low[nowPoint],price[nowV]);q.push(Node{nowV,dis_Low[nowV]});}}}
}
struct Edge_High{int from,to,nxt;
}e_High[MAXM];
int head_High[MAXN],edgeCnt_High=0;
void addEdge_High(int u,int v){e_High[++edgeCnt_High].from=u;e_High[edgeCnt_High].to=v;e_High[edgeCnt_High].nxt=head_High[u];head_High[u]=edgeCnt_High;
}
int s_High;
int dis_High[MAXN];
void dijkstra_High(){//售出尽量高价 for(int i=1;i<=n;i++)dis_High[i]=-INF;priority_queue<Node> q;q.push(Node{s_High,price[s_High]});dis_High[s_High]=price[s_High];while(!q.empty()){Node nowNode=q.top();q.pop();int nowPoint=nowNode.nowPoint,nowValue=nowNode.nowValue;if(dis_High[nowPoint]!=nowValue)continue;for(int i=head_High[nowPoint];i;i=e_High[i].nxt){int nowV=e_High[i].to;if(dis_High[nowV]<dis_High[nowPoint]){dis_High[nowV]=max(dis_High[nowPoint],price[nowV]);q.push(Node{nowV,dis_High[nowV]});}}}
}
int main(){int m;scanf("%d%d",&n,&m);s_Low=1,s_High=n;for(int i=1;i<=n;i++)scanf("%d",&price[i]);for(int i=1;i<=m;i++){int u,v,z;scanf("%d%d%d",&u,&v,&z);addEdge_Low(u,v);addEdge_High(v,u);if(z==2){addEdge_Low(v,u);addEdge_High(u,v);}}dijkstra_Low();dijkstra_High();int ans=-INF;for(int i=1;i<=n;i++)ans=max(ans,dis_High[i]-dis_Low[i]);printf("%d\n",ans);return 0;
}

 

这篇关于CH6101 最优贸易的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1099853

相关文章

一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)

1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear["Global`*"]f0[x_, a_, b_, c_, d_] := (a*x - b)*(d - c*x);(*(b c+a d)/(2 a c)*)Maximize[{f0[x, a, b,

4-4.Andorid Camera 之简化编码模板(获取摄像头 ID、选择最优预览尺寸)

一、Camera 简化思路 在 Camera 的开发中,其实我们通常只关注打开相机、图像预览和关闭相机,其他的步骤我们不应该花费太多的精力 为此,应该提供一个工具类,它有处理相机的一些基本工具方法,包括获取摄像头 ID、选择最优预览尺寸以及打印相机参数信息 二、Camera 工具类 CameraIdResult.java public class CameraIdResult {

华为OD机试 - 最优结果的a数组数量 - 贪心思维(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。 一、题目描述

清华MEM作业-利用管理运筹学的分析工具slover求解最优解的实现 及 通过使用文件或者套节字来识别进程的fuser命令

一、清华MEM作业-利用管理运筹学的分析工具slover求解最优解的实现         最近又接触了一些线性求解的问题,以前主要都是在高中数学里接触到,都是使用笔算,最后通过一些函数式得出最小或者最大值,最近的研究生学业上接触到了一个Excel solver分析工具,对这种线性求最优解的问题感觉使用起来真是得心应手。在使用这个工具前,EXCEL里需要先装上solver工具,装起来很也简单,网上

【POJ】2728 Desert King 最优比率生成树——01分数规划【经典】

最近在刷巨巨们放出来的专题,然后没做几题就卡住了,果然还是太弱了T U T... 这次做到了一题01分数规划求解的生成树问题。 题目大意是这样的:给你一个无向完全图,每条边i都有两个权值,长度a[ i ],花费b[ i ],需要选出其中的一些边构造一颗生成树,生成树需要满足条件:∑ b [ i ] / ∑ a [ i ]最小。 这样我还是先来介绍一下01分数规划吧~ 给定一个上述的问

2024国赛数学建模备赛|30种常用的算法模型之最优算法-非线性规划

1.1   非线性规划的实例与定义 如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。一般说来,解非线性规划要比解线性规划问题困难得多。而且,也不象线性规划有 单纯形法这一通用方法,非线性规划目前还没有适于各种问题的一般算法,各个方法都 有自己特定的适用范围。 下面通过实例归纳出非线性规划数学模型的一般形式,介绍有关非线性规划的基本 概念。 最佳投资方案应是投资

超好用的图纸加密软件排行榜 | 2024图纸加密软件的七款最优选择!

数字化设计日益普及的今天,图纸作为设计与工程的核心载体,其安全性成为了企业和设计师们最为关注的焦点之一。 面对日益复杂的数据泄露风险,如何有效地保护图纸文件的安全呢? 下面,我们就来探讨一下2024图纸加密软件的最优选择,为您介绍七款超好用的图纸加密软件! 一、域智盾:专业级图纸加密的领军者 ①透明加密 采用基于Windows文件系统驱动开发的透明加密技术,结合高强度国际流行加密算法

最短路径算法:迪杰克斯拉(Dijkstra)算法(基于贪心思想)【从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题】【能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低】

Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。 Viterbi和Dijkstra算法看起来比较像,两者的区别: Dijkstra算法适应范围更广。Viterbi算法用在特殊的有向无环图中,而Dijkstra算法可以用在

【Spfa】noip2009 最优贸易

最优贸易 (trade.pas/c/cpp) 【问题描述】 C 国有n 个大城市和 m 条道路,每条道路连接这n 个城市中的某两个城市。任意两个城市之间最多只有一条道路直接相连。这m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为1 条。    C 国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同。但是,同

问题最优解:实际问题转换图论问题

文章目录 图论的本质概念理解指标衡量哪些实际问题可以转换成图论问题?案例:城市交通优化 图算法的作用及求解优化概念理解指标衡量案例:网络流量优化 图论的局限性与可能性概念理解指标衡量案例:社交网络中的用户行为分析 图论结构与模型概念理解指标衡量哪些场景问题可以转换成图模型?案例:医疗诊断中的贝叶斯网络 图论与机器学习概念理解指标衡量常见场景案例:社交网络中的用户行为预测 图算法的并行化与分布