题目链接

先\(Tarjan\)缩点,记录每个环内的最大值和最小值。

然后跑拓扑排序,\(Min[u]\)表示到\(u\)的最小值,\(ans[u]\)表示到\(u\)的答案,\(Min\)和\(ans\)都在拓扑排序中更新和传递。

最终答案就是\(ans[n]\)。

\(100\)多行敲着心累

  1. #include <cstdio>
  2. #include <cstring>
  3. #define Open(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout);
  4. #define Close fclose(stdin);fclose(stdout);
  5. namespace IO{
  6. int xjc; char ch;
  7. inline int read(){
  8. xjc = 0; ch = getchar();
  9. while(ch < '0' || ch > '9') ch = getchar();
  10. while(ch >= '0' && ch <= '9'){ xjc = xjc * 10 + ch - '0'; ch = getchar(); }
  11. return xjc;
  12. }
  13. }using namespace IO;
  14. inline int max(int a, int b){
  15. return a > b ? a : b;
  16. }
  17. inline int min(int a, int b){
  18. return a > b ? b : a;
  19. }
  20. const int MAXN = 100010;
  21. const int MAXM = 500010;
  22. struct Queue{
  23. int s[MAXN];
  24. int head, tail;
  25. inline void push(int x){
  26. s[++tail] = x;
  27. }
  28. inline int pop(){
  29. return s[++head];
  30. }
  31. inline int size(){
  32. return tail - head;
  33. }
  34. }q;
  35. struct Edge{
  36. int from, next, to;
  37. };
  38. struct Graph{
  39. int head[MAXN], num;
  40. Edge e[MAXM << 1];
  41. inline void Add(int from, int to){
  42. e[++num].to = to; e[num].from = from; e[num].next = head[from]; head[from] = num;
  43. }
  44. }G, T, P;
  45. int dfn[MAXN], low[MAXN], id, vis[MAXN], stack[MAXN], w[MAXN], top, cnt, belong[MAXN], v[MAXN];
  46. int minw[MAXN], maxw[MAXN], now, in[MAXN], Min[MAXN], ans[MAXN];
  47. void Tarjan(int u){
  48. dfn[u] = low[u] = ++id; vis[u] = 1; stack[++top] = u;
  49. for(int i = G.head[u]; i; i = G.e[i].next)
  50. if(!dfn[G.e[i].to]){
  51. Tarjan(G.e[i].to);
  52. low[u] = min(low[u], low[G.e[i].to]);
  53. }
  54. else if(vis[G.e[i].to])
  55. low[u] = min(low[u], dfn[G.e[i].to]);
  56. if(dfn[u] == low[u]){
  57. ++cnt;
  58. do{
  59. now = stack[top--];
  60. vis[now] = 0;
  61. belong[now] = cnt;
  62. minw[cnt] = min(minw[cnt], w[now]);
  63. maxw[cnt] = max(maxw[cnt], w[now]);
  64. P.Add(cnt, now);
  65. }while(now != u);
  66. }
  67. }
  68. int n, m, a, b, c;
  69. int main(){
  70. Open("trade");
  71. memset(minw, 127, sizeof minw);
  72. memset(Min, 127, sizeof Min);
  73. n = read(); m = read();
  74. for(int i = 1; i <= n; ++i)
  75. w[i] = read();
  76. for(int i = 1; i <= m; ++i){
  77. a = read(); b = read(); c = read();
  78. G.Add(a, b);
  79. if(c == 2) G.Add(b, a);
  80. }
  81. for(int i = 1; i <= n; ++i)
  82. if(!dfn[i])
  83. Tarjan(i);
  84. for(int i = 1; i <= cnt; ++i){
  85. for(int j = P.head[i]; j; j = P.e[j].next){
  86. int u = P.e[j].to;
  87. for(int k = G.head[u]; k; k = G.e[k].next)
  88. if(belong[G.e[k].to] != i && !v[belong[G.e[k].to]]){
  89. v[belong[G.e[k].to]] = 1;
  90. T.Add(i, belong[G.e[k].to]);
  91. ++in[belong[G.e[k].to]];
  92. }
  93. }
  94. for(int j = P.head[i]; j; j = P.e[j].next){
  95. int u = P.e[j].to;
  96. for(int k = G.head[u]; k; k = G.e[k].next)
  97. v[belong[G.e[k].to]] = 0;
  98. }
  99. }
  100. q.push(belong[1]);
  101. while(q.size()){
  102. now = q.pop();
  103. Min[now] = min(Min[now], minw[now]);
  104. ans[now] = max(ans[now], maxw[now] - Min[now]);
  105. for(int i = T.head[now]; i; i = T.e[i].next){
  106. int v = T.e[i].to;
  107. if(!(--in[v])) q.push(v);
  108. Min[v] = min(Min[v], Min[now]);
  109. ans[v] = max(ans[v], ans[now]);
  110. }
  111. }
  112. printf("%d\n", ans[belong[n]]);
  113. return 0;
  114. }

【洛谷 P1073】 最优贸易 (Tarjan缩点+拓扑排序)的更多相关文章

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

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

  2. 洛谷P1073 最优贸易==codevs1173 最优贸易

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

  3. 洛谷——P1073 最优贸易

    P1073 最优贸易 n 个城市间以 m 条有向道路连接, 小 T 从 1 号城市出发, 将要去往 n 号城市.小 T 观察到一款商品 Z 在不同的城市的价格可能不尽相同,小 T 想要在旅行中的某一个 ...

  4. 洛谷 P1073 最优贸易 最短路+SPFA算法

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1073 最优贸易 题目描述 C国有 $ n $ 个大城市和 ...

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

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

  6. 洛谷 P1073 最优贸易

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

  7. 洛谷 P1073 最优贸易 & [NOIP2009提高组](反向最短路)

    传送门 解题思路 很长的题,实际上在一个有向图(点有点权)中求一个从起点1到终点n的路径,使得这条路径上点权最大的点与点权最小的点的差值最大(要求必须从点权较小的点能够走到点权较大的点). ——最短路 ...

  8. NOIP2009 codevs1173 洛谷P1073 最优贸易

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

  9. [NOIP2009] 提高组 洛谷P1073 最优贸易

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

  10. 洛谷P1073最优贸易——双向取值

    题目:https://www.luogu.org/problemnew/show/P1073 由于任何城市都可以多次经过,所以可以随便走,也就不用太在意有向边和无向边,把无向边当做两条有向边处理: 根 ...

随机推荐

  1. ACM 第十八天

    数学基础(卷积,FFT,FWT,FMT,鸽巢原理,群论,哈里亚余数,哈里亚计数定理,组合数学,LVG定理,期望DP,期望点贡献问题) 练习题: A - Necklace of Beads Beads ...

  2. LintCode-72.中序遍历和后序遍历树构造二叉树

    中序遍历和后序遍历树构造二叉树 根据中序遍历和后序遍历树构造二叉树 注意事项 你可以假设树中不存在相同数值的节点 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下的树: ...

  3. PAT 甲级 1048 Find Coins

    https://pintia.cn/problem-sets/994805342720868352/problems/994805432256675840 Eva loves to collect c ...

  4. ubuntu 安装lua错误

    转自:http://www.cnblogs.com/softidea/archive/2016/03/02/5236498.html lua.c:80:31: fatal error: readlin ...

  5. 关于如何解决PHPCMS V9内容搜索显示不全问题解决方案

    站长朋友们都晓得只要是开源的PHP程序都会有漏洞存在.如果想完美的建站就需要自己去研究打补丁了.最近很多站长联系小编咨询用phpcms建站当在首页搜索内容的时候有的居然搜索不到.小编感到很是奇怪于是就 ...

  6. 主流 Kubernetes 发行版梳理

    2014 年,Kubernetes 作为内部 Google orchestrator Borg 开源版本推出,目前已是最成功和发展最快的 IT 基础架构项目之一.2018 年,Kubernetes 已 ...

  7. mysql,oracle,sql server中的默认事务隔离级别查看,更改

    未提交读(隔离事务的最低级别,只能保证不读取物理上损坏的数据) 已提交读(数据库引擎的默认级别) 可重复读 可序列化(隔离事务的最高级别,事务之间完全隔离) 可串行化比较严谨,级别高; MySQL m ...

  8. React & `event.persist()`

    React & event.persist() event.persist() https://reactjs.org/docs/events.html#event-pooling Tabs ...

  9. 从HR 到SBP其实还有很长的一段路要走

    战略性业务伙伴 Strategic business partners 关于这本书,一般是因为好奇,从HR到BP的角色,再到这个SBP,其实是一段没有走过的很虚的过程,不过总归是需要灯塔,即使偶尔只是 ...

  10. powerdesigner 点击preview 语句出现 if exists

    drop table if exists XXX 这个是sql server 写法.如果要切换为 Oracle 写法 菜单栏: database-->change curren DBMS 选择你 ...