博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu P1073 最优贸易
阅读量:4983 次
发布时间:2019-06-12

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

一上来没想出来qwq

后来Ssy说有4种做法?

(updated: Dijkstra双向广搜,缩点+dp,直接dp,spfa+分层图)

这里就说想起来最简单(同时也是最难写的)双向广搜

由于卖的点一定在买的点后面

所以我们记录一下pre[i]表示i之前最小值

suf[i]表示i之后的最大值

跑两遍dij就可以求

最后O(n)遍历求一下最大差就行

Code:

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #define pr pair
8 #define mp make_pair 9 #define rep(i,a,n) for(int i = a;i <= n;i++) 10 #define per(i,n,a) for(int i = n;i >= a;i--) 11 #define ms(a,b) memset(a,b,sizeof a) 12 #define inf 2147483647 13 using namespace std; 14 typedef long long ll; 15 ll read() { 16 ll as = 0,fu = 1; 17 char c = getchar(); 18 while(c < '0' || c > '9') { 19 if(c == '-') fu = -1; 20 c = getchar(); 21 } 22 while(c >= '0' && c <= '9') { 23 as = as * 10 + c - '0'; 24 c = getchar(); 25 } 26 return as * fu; 27 } 28 29 const int N = 200005; 30 //head 31 int n,m,ans,a[N]; 32 int head[N],mo[N],nxt[N],cnt; 33 void add(int x,int y) { 34 mo[++cnt] = y; 35 nxt[cnt] = head[x]; 36 head[x] = cnt; 37 return; 38 } 39 40 int Head[N],Mo[N],Nxt[N],Cnt; 41 void Add(int x,int y) { 42 Mo[++Cnt] = y; 43 Nxt[Cnt] = Head[x]; 44 Head[x] = Cnt; 45 return; 46 } 47 48 int dis[N],Dis[N]; 49 bool vis[N],Vis[N]; 50 void dij(int s) { 51 rep(i,1,n) dis[i] = inf; 52 dis[s] = a[s]; 53 priority_queue
, greater
> q; 54 q.push(mp(dis[s],s)); 55 while(!q.empty()) { 56 int x = q.top().second; 57 q.pop(); 58 if(vis[x]) continue; 59 vis[x] = 1; 60 for(int i = head[x];i;i = nxt[i]) { 61 int sn = mo[i]; 62 if(dis[sn] > min(dis[x],a[sn])) { 63 dis[sn] = min(dis[x],a[sn]); 64 q.push(mp(dis[sn],sn)); 65 } 66 } 67 } 68 return; 69 } 70 71 void Dij(int s) { 72 Dis[s] = a[s]; 73 priority_queue
q; 74 q.push(mp(Dis[s],s)); 75 while(!q.empty()) { 76 int x = q.top().second; 77 q.pop(); 78 if(Vis[x]) continue; 79 Vis[x] = 1; 80 for(int i = Head[x];i;i = Nxt[i]) { 81 int sn = Mo[i]; 82 if(Dis[sn] < max(Dis[x],a[sn])) { 83 Dis[sn] = max(Dis[x],a[sn]); 84 q.push(mp(Dis[sn],sn)); 85 } 86 } 87 } 88 return; 89 } 90 int main() { 91 n = read(); 92 m = read(); 93 rep(i,1,n) a[i] = read(); 94 rep(i,1,m) { 95 int x = read(); 96 int y = read(); 97 int z = read(); 98 add(x,y),Add(y,x); 99 if(z == 2) Add(x,y),add(y,x);100 }101 dij(1),Dij(n);102 rep(i,1,n) ans = max(ans,Dis[i] - dis[i]);103 printf("%d\n",ans);104 return 0;105 }
View Code

 

转载于:https://www.cnblogs.com/yuyanjiaB/p/9928138.html

你可能感兴趣的文章
iOS开发Xcode中切换显示语言实现国际化
查看>>
C++模板学习
查看>>
nginx
查看>>
大数据平台搭建-hadoop集群的搭建
查看>>
安装一些包管理的记录 win10
查看>>
Android RecyclerView notifyDataSetChanged不起作用
查看>>
AndroidStudio3.0 Canary 8注解报错Annotation processors must be explicitly declared now.
查看>>
Android 一个改进的okHttp封装库
查看>>
genymotion下载出现Unable to create virtual device,Server returned HTTP status code 0.
查看>>
Android 下拉刷新框架实现
查看>>
ViewPager + Fragment实现滑动标签页
查看>>
Spring与Hibernate实现增删改查两方法
查看>>
Genymotion 插件在 Eclipse 和 Android Studio 中点击后无法初始化 Initialize Engine: failed 解决方法...
查看>>
1R安装环境
查看>>
初学Python——Socket网络编程
查看>>
Linux 如何实现 VLAN - 每天5分钟玩转 OpenStack(12)
查看>>
Gym - 101252H
查看>>
2019年2月15日,复习
查看>>
线性布局Row和Column
查看>>
关键路径(代码讲解)- 数据结构和算法68
查看>>