题目传送门:洛谷P1073

dalao们都用的tarjan啊拓扑排序啊之类的玩意儿,我这个蒟蒻不会,只想到了极其暴力的分层图最短路

设三个状态

0表示没有发生任何买卖的情况

1表示买了没有卖的情况

2表示已经卖了的情况

这样建出来一个3层的图,用dis[i][j]表示从起点到i点,处在j状态下获得的最大收益

状态转移方程://id就是从哪个点来

对于所有的状态,都可以在同状态下相互更新dis值,所以
dis[to][sit]=max(dis[to][sit],dis[id][sit])

状态1可以由状态0时购买水晶球得到,购买是减收益,所以
dis[to][1]=max(dis[to][1],dis[id][0]-pri[to])

状态2可以由状态1时卖出水晶球得到,卖出增加了收益,所以
dis[to][2]=max(dis[to][2],dis[id][1]+pri[to])

注意有可能会出现不买不卖的情况,也就可以理解为在某一点买了马上又卖,给每个点加个自环就可以处理这种情况了

观察状态转移方程,发现有负权边,不能用dijkstra,所以spfa走起

最后输出dis[n][2],终点的状态2

AC代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<queue>
  7. using namespace std;
  8.  
  9. const int INF=;
  10. int n,m=;
  11. struct star{//链式前向星
  12. int u,v;
  13. }edge[];
  14. int last[],next[];
  15. void addedge(int u,int v){//加边
  16. m++;
  17. edge[m]=(star){u,v};
  18. }
  19. void starinit(){//前向星初始化
  20. for(int i=;i<=n;i++) last[i]=-;
  21. for(int i=;i<=m;i++){
  22. int flag=edge[i].u;
  23. next[i]=last[flag];
  24. last[flag]=i;
  25. }
  26. }
  27. int pri[];//每个点水晶球的价格
  28.  
  29. struct mem{
  30. int id,sit;
  31. }que[];
  32. int head,tail;
  33. void push(mem pig){
  34. que[tail]=pig;tail++;
  35. }
  36. void pop(){head++;}
  37.  
  38. int dis[][],book[][];
  39. void spfa(int sta){
  40. head=;tail=;
  41. for(int i=;i<=n;i++){dis[i][]=-INF;dis[i][]=-INF;dis[i][]=-INF;book[i][]=;book[i][]=;book[i][]=;}
  42. dis[][]=;
  43. book[sta][]=;
  44. push((mem){sta,});
  45. for(;head<tail;){
  46.  
  47. int id=que[head].id;
  48. int sit=que[head].sit;
  49. for(int i=last[id];i!=-;i=next[i]){
  50. int to=edge[i].v;
  51. if(dis[to][sit]<dis[id][sit]){//通用转移方程
  52. dis[to][sit]=dis[id][sit];
  53. if(book[to][sit]==){
  54. book[to][sit]=;
  55. push((mem){to,sit});
  56. }
  57. }
  58. switch(sit){
  59. case :{
  60. if(dis[to][]<dis[id][]-pri[to]){//0->1
  61. dis[to][]=dis[id][]-pri[to];
  62. if(book[to][]==){
  63. book[to][]=;
  64. push((mem){to,});
  65. }
  66. }
  67. break;
  68. }
  69. case :{
  70. if(dis[to][]<dis[id][]+pri[to]){//1->2
  71. dis[to][]=dis[id][]+pri[to];
  72. if(book[to][]==){
  73. book[to][]=;
  74. push((mem){to,});
  75. }
  76. }
  77. break;
  78. }
  79. }
  80. }
  81. book[id][sit]=;
  82. pop();
  83. }
  84. }
  85.  
  86. int main(){
  87. m=;
  88. int cirno;
  89. cin>>n>>cirno;
  90. for(int i=;i<=n;i++){
  91. scanf("%d",&pri[i]);
  92. }
  93. for(int i=;i<=cirno;i++){
  94. int u,v,type;
  95. scanf("%d%d%d",&u,&v,&type);
  96. addedge(u,v);
  97. if(type==) addedge(v,u);
  98. }
  99. for(int i=;i<=n;i++) addedge(i,i);//加自环
  100. starinit();
  101. spfa();
  102. cout<<dis[n][];
  103. return ;
  104. }
  105. /*
  106. 自测
  107. 7 8
  108. 9 2 3 2 10 1 7
  109. 1 2 1
  110. 2 3 1
  111. 3 7 1
  112. 7 6 1
  113. 6 3 1
  114. 7 4 1
  115. 4 5 1
  116. 5 3 1
  117. */

NOIP2009 t3 最优贸易的更多相关文章

  1. 「NOIP2009」最优贸易 题解

    「NOIP2009」最优贸易 题解 题目TP门 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 ...

  2. 「NOIP2009」最优贸易

    「NOIP2009」最优贸易 「NOIP2009」最优贸易内存限制:128 MiB时间限制:1000 ms 题目描述C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意 ...

  3. 【NOIP2009 T3】 最佳贸易 (双向SPFA)

    C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道 ...

  4. 【NOIP2009】最优贸易

    描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通 ...

  5. #2590. 「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. [Luogu 1073] NOIP2009 最优贸易

    [Luogu 1073] NOIP2009 最优贸易 分层图,跑最长路. 真不是我恋旧,是我写的 Dijkstra 求不出正确的最长路,我才铤而走险写 SPFA 的- #include <alg ...

  9. [NOIP2009]最优贸易(图论)

    [NOIP2009]最优贸易 题目描述 CC 国有 \(n\) 个大城市和 \(m\) 条道路,每条道路连接这 \(n\) 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 \(m\ ...

随机推荐

  1. 计算机基础理论知识梳理篇(一):数据类型长度、内存页、IPC

    字长与数据类型长度 字长指CPU在同一时间能够处理二进制数据的位数,是由其外接数据总线(地址总线决定了CPU的寻址空间,如16位微型机的地址总线为20位,其可寻址空间为220 = 1MB)的条数决定的 ...

  2. Aerospike-内存和硬盘混合存储的kv数据库

    为什么会有Aerospike? Redis是一个纯内存型数据库,性能上没有多大问题. 但这又带来一个新问题,内存是很贵的,所以全内存的存储成本非常昂贵.为了节省成本,我们需要把一部分不经常用到的数据存 ...

  3. 中间件方法必须返回Response对象实例(tp5.1+小程序结合时候出的问题)

    前言:在最近开发小程序通过中间件检查是否携带token时候报的一个错误 解决方法: 根据手册中需要return出去才可以不报错

  4. 第十一节: EF的三种模式(一) 之 DBFirst模式(SQLServer和MySQL两套方案)

    一. 简介 EF连接数据库有三种模式,分别是DBFirst.ModelFirst.CodeFirst,分别适用于不同的开发场景. 该章节,将主要介绍EF的DBFirst连接SQLServer数据库和M ...

  5. [物理学与PDEs]第5章习题7 各向同性材料时稳定性条件的等价条件

    在线性弹性时, 证明各向同性材料, 稳定性条件 (5. 27) 等价于 Lam\'e 常数满足 $$\bex \mu>0,\quad \lm+\cfrac{2}{3}\mu>0.  \ee ...

  6. SpringBoot之解决云服务器VPS在所处云端集群的内网不能解析域名的问题:java.net.UnknownHostException:abc.cn: Temporary failure in name resolution

    一.起因与原因分析过程 前端小伙伴儿告诉我,说服务器崩了. 请求数据接口,接口有响应,但报的json提示指向:数据库异常错误. 遂登陆云主机查看日志,核心记录显示如下: 2018-11-09 22:1 ...

  7. rem自适应js

    Rem自适应js---flexible.min.js   网上看到很多移动端适配的各种方法,由于原来工作中对rem的疏忽,所以决定重新学习rem~ 由于移动端特殊性,本文讲的是如何使用rem实现自适应 ...

  8. JavaScript的数据类型和变量

    1.  数据类型:JS使用弱类型,共4种基本类型,其数据可以是变量,也可以是常量. a)         数值(整数和实数) b)         字符串型(用“”号或‘’括起来的字符或数值) c)  ...

  9. 【先验知识归纳】Flask快速入门

    本文参考:快速入门 - Flask 0.10.1 文档 路由 Flask使用route修饰器来关联URL与程序函数: @app.route('/') def hello_world(): return ...

  10. java 面经

    1.什么是Java虚拟机(JVM)?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. ...