欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ1179


题意概括

  有一个有向图,每一个节点有一个权值,其中有一些结束点。

  现在,你要从S出发,到达任意一个结束点,使得经过的节点的权值和最大(可以重复经过某一个节点,但是权值只记入一次)。


题解

  小码农题。

  如果有强连通分量,那么之间的点是可以全部拿到的,傻子才不拿。

  所以先Tarjan强连通缩个点。

  然后就是一个DAG(有向无环图)了。

  那么就是一个记忆化dfs的问题了。

  于是就简单了。

  but,尴尬的我犯了低级错误,又wa了一次……

  


代码

  1. #include <cstring>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cmath>
  6. using namespace std;
  7. const int N=+;
  8. const int Inf=;
  9. struct Gragh{
  10. int cnt,x[N],y[N],nxt[N],fst[N];
  11. void set(){
  12. cnt=;
  13. memset(fst,,sizeof fst);
  14. }
  15. void add(int a,int b){
  16. x[++cnt]=a,y[cnt]=b;
  17. nxt[cnt]=fst[a],fst[a]=cnt;
  18. }
  19. }g,g2;
  20. int n,m,time,top,tot;
  21. int dfn[N],low[N],bh[N],st[N],w[N],v[N],dp[N],S,P;
  22. bool inst[N],vis[N],isp[N],fip[N];
  23. void Tarjan_Prepare(){
  24. time=top=tot=;
  25. memset(bh,,sizeof bh);
  26. memset(st,,sizeof st);
  27. memset(dfn,,sizeof dfn);
  28. memset(low,,sizeof low);
  29. memset(vis,,sizeof vis);
  30. memset(inst,,sizeof inst);
  31. }
  32. void Tarjan(int x){
  33. dfn[x]=low[x]=++time;
  34. inst[x]=vis[x]=;
  35. st[++top]=x;
  36. for (int i=g.fst[x];i;i=g.nxt[i])
  37. if (!vis[g.y[i]]){
  38. Tarjan(g.y[i]);
  39. low[x]=min(low[x],low[g.y[i]]);
  40. }
  41. else if (inst[g.y[i]])
  42. low[x]=min(low[x],low[g.y[i]]);
  43. if (dfn[x]==low[x]){
  44. tot++;
  45. bh[st[top]]=tot;
  46. inst[st[top]]=;
  47. while (st[top--]!=x){
  48. bh[st[top]]=tot;
  49. inst[st[top]]=;
  50. }
  51. }
  52. }
  53. int dfs(int x){
  54. if (dp[x]!=-Inf)
  55. return dp[x];
  56. dp[x]=fip[x]?v[x]:-Inf;
  57. for (int i=g2.fst[x];i;i=g2.nxt[i])
  58. dp[x]=max(dp[x],dfs(g2.y[i])+v[x]);
  59. return dp[x];
  60. }
  61. int main(){
  62. g.set();
  63. scanf("%d%d",&n,&m);
  64. for (int i=,a,b;i<=m;i++){
  65. scanf("%d%d",&a,&b);
  66. g.add(a,b);
  67. }
  68. for (int i=;i<=n;i++)
  69. scanf("%d",&w[i]);
  70. scanf("%d%d",&S,&P);
  71. memset(isp,,sizeof isp);
  72. memset(fip,,sizeof fip);
  73. memset(v,,sizeof v);
  74. for (int i=,pos;i<=P;i++){
  75. scanf("%d",&pos);
  76. isp[pos]=;
  77. }
  78. Tarjan_Prepare();
  79. for (int i=;i<=n;i++)
  80. if (!vis[i])
  81. Tarjan(i);
  82. g2.set();
  83. for (int i=;i<=n;i++)
  84. v[bh[i]]+=w[i],fip[bh[i]]|=isp[i];
  85. for (int i=;i<=g.cnt;i++)
  86. if (bh[g.x[i]]!=bh[g.y[i]])
  87. g2.add(bh[g.x[i]],bh[g.y[i]]);
  88. for (int i=;i<=tot;i++)
  89. dp[i]=-Inf;
  90. printf("%d",dfs(bh[S]));
  91. return ;
  92. }

BZOJ1179 [Apio2009]Atm Tarjan 强连通缩点 动态规划的更多相关文章

  1. BZOJ1051 [HAOI2006]受欢迎的牛 Tarjan 强连通缩点

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1051 题意概括 有n只牛,有m个羡慕关系. 羡慕关系具有传递性. 如果A羡慕B,B羡慕C,那么我们 ...

  2. BZOJ1179 [Apio2009]Atm 【tarjan缩点】

    1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 4048  Solved: 1762 [Submit][Sta ...

  3. BZOJ1179 : [Apio2009]Atm 缩点+spfa

    1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 2069  Solved: 826[Submit][Status ...

  4. NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序

    原文链接https://www.cnblogs.com/zhouzhendong/p/9258043.html 题目传送门 - 洛谷P3953 题目传送门 - Vijos P2030 题意 给定一个有 ...

  5. bzoj1179: [Apio2009]Atm scc缩点+dag上dp

    先把强连通缩点,然后变成了dag,dp求终点是酒吧的最长路即可, /************************************************************** Pro ...

  6. BZOJ 1179: [Apio2009]Atm( tarjan + 最短路 )

    对于一个强连通分量, 一定是整个走或者不走, 所以tarjan缩点然后跑dijkstra. ------------------------------------------------------ ...

  7. 【BZOJ-1179】Atm Tarjan + SPFA

    1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 2407  Solved: 993[Submit][Status ...

  8. 【CCF】高速公路 tarjan强连通缩点

    [题意] 给定一个有向图,问图中互相可达(强连通)的点有多少对 [AC] 强连通缩点,缩点后是一个DAG,所以互相可达的点只在强连通块里. #include<iostream> #incl ...

  9. 【bzoj1179】[Apio2009]Atm Tarjan缩点+Spfa最长路

    题目描述 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每 ...

随机推荐

  1. STM32Cube自学-1

    为了方便调试,使用Keil5+Proteus.1.新建Proteus STM32项目,选择STMF103C6 2.新建STM32CubeMX项目,选择同型号CPU,选择UART1,Asynchrono ...

  2. C# 生成一个带数字的饼图

    using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D ...

  3. linux4.10.8 内核移植(一)---环境搭建及适配单板。

    一.环境搭建 源码包下载:git clone https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.10.8.tar.gz 或者直接去kernel. ...

  4. 工控安全入门之Ethernet/IP

    这一篇依然是协议层面的,协议层面会翻译三篇,下一篇是电力系统中用的比较多的DNP3.这一篇中大部分引用的资料都可以访问到,只有一篇reversemode.com上的writeup(http://rev ...

  5. js 将很长的内容进行页面分页显示

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. php 匹配替换中文

    1.匹配中文 $str = "中文“; preg_match_all("/[\x{4e00}-\x{9fa5}]+/u",$str,$match); 2.替换中文: 在所 ...

  7. freeRTOS中文实用教程1--任务

    1.前言 FreeRTOS是小型多任务嵌入式操作系统,硬实时性.本章主要讲述任务相关特性及调度相关的知识. 2. 任务的总体特点 任务的状态 (1)任务有两个状态,运行态和非运行态 (2)任务由非运行 ...

  8. 【转】snprintf()函数使用方法

    众所周知,sprintf不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf. 注:sprintf()函数:int sprintf( char *buffer, const ...

  9. 【转】OpenCV对图片中的RotatedRect进行填充

    函数名:full_rotated_rect 函数参数: image输入图像,rect希望在图像中填充的RotatedRect,color填充的颜色 主要的思路是:先找到RotatedRect的四个顶点 ...

  10. day1 diff命令递归比较目录下的文件

    一.diff实战 (1)递归比较文件夹下所有的文件及目录的不同 diff --brief -Nr dir1/ dir2/                               Reference ...