博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nyoj 虚拟的城市之旅(bfs)
阅读量:6272 次
发布时间:2019-06-22

本文共 2940 字,大约阅读时间需要 9 分钟。

描述
 
展馆是未来城市的缩影,个人体验和互动是不变的主题。在A国展馆通过多维模式和高科技手段,引领参观者在展示空间踏上一段虚拟的城市之旅。
梦幻国有N个城市和M条道路,每条道路连接某两个城市。任意两个城市之间最多只有一条道路直接相连。这M条道路中有一部分为单向通行的道路,一部分为双向通行的道路。
梦幻国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同。但是,同一种商品在同一个城市的买入价和卖出价始终是相同的。
现在你已踏上一段虚拟的城市之旅。为了给你一个意外收获,允许你在旅游的同时,利用 X 商品在不同城市中的差价赚回一点旅费,但最多只能交易一次。即,在某个城市买入X 商品,可以走到另外一个城市买掉来获得旅费。当然,在赚不到差价的情况下,你也可以不进行贸易活动。
设梦幻国N个城市的标号从1~ N,你只能从1 号城市出发,并最终在N 号城市结束自己的旅行。在旅游的过程中,任何城市可以重复经过多次,但不要求经过所有N个城市。
例如:梦幻国有5个大城市,城市的编号和道路连接情况如下图,单向箭头表示这条道路为单向通行,双向箭头表示这条道路为双向通行。假设 X 商品在1~5 号城市的价格分别为 4,3,5,6,1。
你可以选择如下一条线路:1235,并在2 号城市以3 的价格买入X 商品,在3号城市以5 的价格卖出X 商品,赚取的旅费数为2。
你也可以选择如下一条线路14545,并在第1次到达5号城市时以1的价格买入X 商品,在第2次到达4号城市时以6 的价格卖出X 商品,赚取的旅费数为5。
现在给出N个城市的X 商品价格,M条道路的信息(每条道路所连接的两个城市的编号以及该条道路的通行情况)。请问你能赚取尽可能多的旅费吗。
 
输入
有多组测试数据(以EOF为文件结束的标志)
每组测试数据的格式如下:
第一行:N M 分别表示城市的数目和道路的数目。
第二行:N个正整数,每两个整数之间用一个空格隔开,分别表示1到N个城市的商品价格。
接下来 M行,每行有3个正整数,X,Y,Z,每两个整数之间用一个空格隔开。
如果 Z=1,表示这条道路是城市X到城市Y之间的单向道路;
如果Z=2,表示这条道路为城市X 和城市Y之间的双向道路。
1≤N≤100000,1≤M≤500000,
1≤X,Y≤N,1≤Z≤2,1≤商品价格≤100。
输出
输出1个整数,表示最多能赚取的旅费。如果没有进行贸易,则输出0。
样例输入
5 54 3 5 6 11 2 11 4 12 3 23 5 14 5 2
样例输出
5
来源
上传者

 

 

问题就是找一条路径,路径上价格最高的点和价格最低的点差值最大且价格最高的节点的位置在价格最低的节点位置的后面。

设任意一点p,原点s,终点t

求从s到p可以经过的城市中价格最低的值。再求t到p可以经过的城市中价格最高的值(逆建图)

这样的话求出一个min,max.因为min是从s->p ,max是从t->p,所以满足位置关系。

 

 

错误的代码:

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 using namespace std; 13 #define INF 0x3f3f3f3f 14 #define MAX 100010 15 16 //double dis[MAX],mp[MAX][MAX]; 17 int vis[MAX],viss[MAX]; 18 int num[MAX],maxx[MAX],minn[MAX]; 19 int n,m; 20 vector
list[MAX]; 21 22 void min_bfs() 23 { 24 queue
q; 25 memset(vis,0,sizeof(vis)); 26 27 while(!q.empty()) 28 q.pop(); 29 30 q.push(1); 31 vis[1]=1; 32 while(!q.empty()){ 33 int s=q.front(); 34 q.pop(); 35 for(int i=0; i
q; 49 memset(viss,0,sizeof(viss)); 50 51 while(!q.empty()) 52 q.pop(); 53 54 q.push(1); 55 viss[1]=1; 56 while(!q.empty()){ 57 int s=q.front(); 58 q.pop(); 59 for(int i=0; i

 

 

AC代码:     (逆建图)需要好好理解.....

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 using namespace std; 13 #define INF 0x3f3f3f3f 14 #define MAX 100010 15 16 //double dis[MAX],mp[MAX][MAX]; 17 int vis[MAX],viss[MAX]; 18 int num[MAX],maxx[MAX],minn[MAX]; 19 int n,m; 20 vector
list[MAX],llist[MAX]; 21 22 void min_bfs() 23 { 24 queue
q; 25 memset(vis,0,sizeof(vis)); 26 27 while(!q.empty()) 28 q.pop(); 29 30 q.push(1); 31 vis[1]=1; 32 while(!q.empty()){ 33 int s=q.front(); 34 q.pop(); 35 for(int i=0; i
q; 49 memset(viss,0,sizeof(viss)); 50 51 while(!q.empty()) 52 q.pop(); 53 54 q.push(n); 55 viss[n]=1; 56 while(!q.empty()){ 57 int s=q.front(); 58 q.pop(); 59 for(int i=0; i

 

转载于:https://www.cnblogs.com/wangmengmeng/p/5321256.html

你可能感兴趣的文章
深入理解JavaScript系列(29):设计模式之装饰者模式
查看>>
程序员的罪与罚
查看>>
SQL*LOADER错误总结
查看>>
SQL日志收缩
查看>>
【转】MySQL Query Cache 小结
查看>>
SVN分支和合并的简单例子
查看>>
PHP实现的封装验证码类
查看>>
Augular初探
查看>>
PHPStorm下XDebug配置
查看>>
【LeetCode】55. Jump Game
查看>>
Android应用盈利广告平台的嵌入方法详解
查看>>
Linux(CentOS6.5) 开放端口,配置防火墙
查看>>
Func与Action
查看>>
Android ViewPager 应该及技巧
查看>>
ODI KM二次开发手册
查看>>
iOS通讯录整合,兼容iOS789写法,附demo
查看>>
如何将内核静态库编译连接到驱动程序中去【转】
查看>>
GNU KHATA——开源的会计管理软件
查看>>
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发者工具 用SPD开发SharePoint应用程序...
查看>>
Java读取文件加锁代码Demo(利用Java的NIO)
查看>>