【luogu1073】最优贸易(队列)
来源:互联网 发布:怎么把知乎转到微信 编辑:程序博客网 时间:2024/05/16 09:37
题目:
我是超链接
题解:
很有意思的题目,仿佛很麻烦的样子需要dp,但是我们可以发现简单的队列模拟就可以过啦
f[i]表示到i点最大赚取旅费,g[i]表示到i的最小买入价格,类似SPFA遍历边,f可更新就更新f,g可更新就更新g,不管更新了哪一个,都可以加在队列里继续更新啦
代码:
#include <cstdio>#include <queue>#include <iostream>#include <cstring>#define N 100005#define M 1000005using namespace std;int f[N],g[N],tot,nxt[M],point[M],v[M],w[N];bool c[N];//f[i]表示到i点最大赚取旅费,g[i]表示到i的最小买入价格 void addline(int x,int y){++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y;}int main(){int n,m,i;scanf("%d%d",&n,&m);for (i=1;i<=n;i++) scanf("%d",&w[i]);for (i=1;i<=m;i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);if (z==1) addline(x,y);else addline(x,y),addline(y,x);}queue<int>q;memset(c,0,sizeof(c)); c[1]=1;memset(f,0,sizeof(f));memset(g,0x7f,sizeof(g)); g[1]=w[1];q.push(1); while (!q.empty()) { int now=q.front(); q.pop(); c[now]=false; for (i=point[now];i;i=nxt[i]) if (f[v[i]]<max(f[now],w[v[i]]-g[now]) || g[v[i]]>min(g[now],w[v[i]])) { f[v[i]]=max(max(f[v[i]],f[now]),w[v[i]]-g[now]); g[v[i]]=min(min(g[now],g[v[i]]),w[v[i]]); if (!c[v[i]]) c[v[i]]=true,q.push(v[i]); }}printf("%d",f[n]);}
阅读全文
1 0
- 【luogu1073】最优贸易(队列)
- SPFA——Luogu1073 [NOIP2009]最优贸易
- luogu1073 【noip2009提高】最优贸易(spfa)
- [NOIP2009]最优贸易(spfa)
- noip2009 最优贸易(SPFA)
- 最优贸易
- 最优贸易
- 最优贸易
- 最优贸易
- 最优贸易
- NOIP2009最优贸易 (tarjan+dfs)
- noip2009 最优贸易 (spafa+链表)
- 最优贸易(codevs 1173)题解
- code vs 1173 最优贸易 (spfa)
- trade 最优贸易
- VIJOS 1754 最优贸易
- 【Spfa】noip2009 最优贸易
- smartoj P1013 最优贸易
- PhotoShop使用
- 汇编小小的注意点
- 0814-Java接口
- 金币
- Android自定义图形-Shape的使用
- 【luogu1073】最优贸易(队列)
- RandomAccessFile的小demo IO进阶
- zoj3525扫描线
- 初识框架之struts2(一)
- JAVA 线程池的使用
- 【面试复习系列】常用机器学习算法知识点及其解析,面试官会考的几乎都有,欢迎补充
- Java—实现每天定时执行任务
- sql server的存储过程
- bzoj3144 [Hnoi2013]切糕