tarjan缩点,然后按照拓扑序,做1号点能到达的点的答案
具体做法是对每个点记一个min[i],max[i],vis[i]和ans[i]
做拓扑序的时候,假设在从u点开始做,有边u到v,如果vis[u]=1,则则
vis[v]=1(初始时vis[bel[1]]=1);
更新在v点及以前买进的最小进价:min[v]=min{min[v],min[u]}
统计在v点卖出的答案:ans[v]=max{ans[u],ans[v],max[v]-min[v]}
则最后答案就是ans[bel[N]]

貌似还有做两遍spfa的做法...不管了

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. #include<vector>
  6. #define LL long long int
  7. #define inf 0x3f3f3f3f
  8. using namespace std;
  9. const int maxn=,maxm=;
  10.  
  11. LL rd(){
  12. LL x=;char c=getchar();int neg=;
  13. while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
  14. while(c>=''&&c<='') x=x*+c-'',c=getchar();
  15. return x*neg;
  16. }
  17.  
  18. int N,M;
  19. int eg[maxm][],egh[maxn],ect;
  20. int eg2[maxm][],egh2[maxn],ect2;
  21. int val[maxn],in[maxn],bel[maxn];
  22. int dfn[maxn],low[maxn],stk[maxn],sct,tot,pct;
  23. int mi[maxn],ma[maxn],ans[maxn];
  24. vector<int> hav[maxn];
  25. bool instk[maxn],flag[maxn],vis[maxn];
  26.  
  27. inline void adeg(int a,int b){
  28. eg[ect][]=b;eg[ect][]=egh[a];egh[a]=ect++;
  29. }
  30. inline void adeg2(int a,int b){
  31. eg2[ect2][]=b;eg2[ect2][]=egh2[a];egh2[a]=ect2++;
  32. in[b]++;
  33. }
  34.  
  35. void tarjan(int x){
  36. dfn[x]=low[x]=++tot;instk[x]=;stk[++sct]=x;
  37. for(int i=egh[x];i!=-;i=eg[i][]){
  38. int j=eg[i][];
  39. if(instk[j]) low[x]=min(low[x],dfn[j]);
  40. else if(!dfn[j]) {
  41. tarjan(j);low[x]=min(low[x],low[j]);
  42. }
  43. }if(dfn[x]==low[x]){
  44. pct++;mi[pct]=inf;ma[pct]=-inf;
  45. while(sct){
  46. mi[pct]=min(mi[pct],val[stk[sct]]);
  47. ma[pct]=max(ma[pct],val[stk[sct]]);
  48. bel[stk[sct]]=pct;
  49. instk[stk[sct]]=;
  50. hav[pct].push_back(stk[sct]);
  51. if(stk[sct--]==x) break;
  52. }
  53. }
  54. }
  55.  
  56. int main(){
  57. int i,j,k;
  58. //freopen("testdata.in","r",stdin);
  59. N=rd(),M=rd();
  60. for(i=;i<=N;i++) val[i]=rd();
  61. memset(egh,-,sizeof(egh));memset(egh2,-,sizeof(egh2));
  62. for(i=;i<=M;i++){
  63. int a=rd(),b=rd(),c=rd();
  64. adeg(a,b);if(c==) adeg(b,a);
  65. }for(i=;i<=N;i++) if(!dfn[i]) tarjan(i);
  66.  
  67. for(i=;i<=pct;i++){
  68. memset(flag,,pct+);
  69. for(j=;j<hav[i].size();j++){
  70. for(k=egh[hav[i][j]];k!=-;k=eg[k][]){
  71. if(i==bel[eg[k][]]) continue;
  72. if(!flag[bel[eg[k][]]]) adeg2(i,bel[eg[k][]]);
  73. flag[bel[eg[k][]]]=;
  74. }
  75. }
  76. }
  77. queue<int> q;vis[bel[]]=;
  78. for(i=;i<=pct;i++){
  79. if(!in[i]) q.push(i);
  80. }
  81. while(!q.empty()){
  82. int p=q.front();q.pop();
  83. for(i=egh2[p];i!=-;i=eg2[i][]){
  84. j=eg2[i][];
  85. if(vis[p]){
  86. vis[j]=;ans[j]=max(ans[j],ans[p]);
  87. mi[j]=min(mi[j],mi[p]);
  88. ans[j]=max(ans[j],ma[j]-mi[j]);
  89. }
  90. if(!(--in[j])) q.push(j);
  91. }
  92. }
  93. printf("%d\n",ans[bel[N]]);
  94. }

luogu1073 最优贸易 (tarjan+dp)的更多相关文章

  1. [luogu1073 Noip2009] 最优贸易 (dp || SPFA+分层图)

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

  2. [NOIP2009][LuoguP1073] 最优贸易 - Tarjan,拓扑+DP

    Description&Data 题面:https://www.luogu.org/problemnew/show/P1073 Solution Tarjan对联通块缩点,在DAG上按照拓扑序 ...

  3. 题解【luogu1073 最优贸易】

    Solution 考虑原图是 DAG 时怎么做. 拓扑排序 + dp ,令 dp[i] 表示 \(1\) 到 \(i\) 的路径上最小的卖出价格.转移方程就是对每一个可以到达这个点的 dp 取个 mi ...

  4. codevs 1173 最优贸易(DP+SPFA运用)

    /* 中国的题目 ——贱买贵卖 0.0 这题wa了好多遍 第一遍看着题 哎呀这不很简单嘛 从起点能到的点都是合法的点 然后统计合法的点里最大最小值 然后printf 也不知道哪里来的自信 就这么交了 ...

  5. 洛谷P1073 最优贸易 [图论,DP]

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

  6. 洛谷 P1073 最优贸易 解题报告

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

  7. 「NOIP2009」最优贸易 题解

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

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

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

  9. NOIP2009 最优贸易

    3. 最优贸易 (trade.pas/c/cpp) [问题描述] C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间 多只有一条道路直接相连.这 m 条道 ...

随机推荐

  1. Jlink使用技巧之合并烧写文件

    前言 IAP(In-application-programming),即在应用中编程.当产品发布之后,可以通过网络方便的升级固件程序,而不需要拆机下载程序.IAP系统的固件一般由两部分组成,即Boot ...

  2. GitFlow原理浅析

    一.Git优点 分布式存储 , 本地仓库包含了远程仓库的所有内容 . 安全性高 , 远程仓库文件丢失了也不怕 优秀的分支模型 , 创建/合并分支非常的方便 方便快速 , 由于代码本地都有存储 , 所以 ...

  3. springboot 中事件监听模型的一种实现

    目录 定义事件本身 定义事件源 定义监听者 一.需要实现 ApplicationListener 二.使用 @EventListener 注解 测试 项目结构 前言: 事件监听模型是一种常用的设计模式 ...

  4. Helper

    //检测端口是否使用 public static bool VerifyListenerPort(int port) { bool inUse = false; System.Net.NetworkI ...

  5. html绝对路径,相对路径

    .com/eat.php中引用.com/includes/headrt.php的话写includes/header.php .com/service/eat.php中引用.com/includes/h ...

  6. RocketMQ 简单梳理 及 集群部署笔记

    一.RocketMQ 基础知识介绍Apache RocketMQ是阿里开源的一款高性能.高吞吐量.队列模型的消息中间件的分布式消息中间件. 上图是一个典型的消息中间件收发消息的模型,RocketMQ也 ...

  7. Linux下性能调试工具运维笔记

    作为一名资深的linux运维工程师,为方便了解和追求服务器的高性能,如cpu.内存.io.网络等等使用情况,要求运维工程师必须要熟练运用一些必要的系统性能调试工具,liunx下提供了众多命令方便查看各 ...

  8. xcode archive 去掉dsym文件和添加dsym文件

    打包慢,让人发狂!!! 所以我们尝试的去掉一些测试时候用不到的东西 比如DSYM: 这DSYM是收集奔溃的.在测试的时候不需要这些东西的所以去掉就好: 项目  Build Settings -> ...

  9. C. Good Array

    链接 [https://codeforces.com/contest/1077/problem/C] 题意 给你一个数组,问你能去掉某个数使得剩下的数中某个数是其他数的和 输出个数以及他们的下标 分析 ...

  10. 《Linux内核分析》实践2

    <Linux及安全>实践2 一.Linux基本内核模块 1.1什么是内核模块 linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一 ...