洛谷P3627:https://www.luogu.org/problemnew/show/P3627

思路

由于有强连通分量 所以我们可以想到先把整个图缩点

缩点完之后再建一次图 把点权改为边权 并把边权转为负数 即可用SPFA求最短路间接求最长路了

最后我们查询所有的酒吧 跳出最大的ans即可

思路简单 但是代码有些冗长

代码

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. #define maxn 500010
  5. int n,m,s,p,top,num,cnt,col,ans,t,w;
  6. int h[maxn],de[maxn],st[maxn],dfn[maxn],low[maxn],co[maxn],money[maxn],sum[maxn],q[maxn],dis[maxn],x[maxn],y[maxn];
  7. bool vis[maxn],exist[maxn];
  8. struct Edge
  9. {
  10. int to;
  11. int next;
  12. int w;
  13. }e[maxn];
  14. void add(int u,int v)//Tarjan的边
  15. {
  16. e[++cnt].to=v;
  17. e[cnt].next=h[u];
  18. h[u]=cnt;
  19. }
  20. void read()//输入
  21. {
  22. cin>>n>>m;
  23. for(int i=;i<=m;i++)
  24. {
  25. cin>>x[i]>>y[i];
  26. add(x[i],y[i]);
  27. }
  28. for(int i=;i<=n;i++)
  29. cin>>money[i];
  30. cin>>s;
  31. }
  32. void Add(int u,int v,int w)//SPFA的边
  33. {
  34. e[++cnt].w=w;
  35. e[cnt].to=v;
  36. e[cnt].next=h[u];
  37. h[u]=cnt;
  38. }
  39. void Tarjan(int u)//标准Tarjan
  40. {
  41. dfn[u]=low[u]=++num;
  42. vis[u]=;
  43. st[++top]=u;
  44. for(int i=h[u];i;i=e[i].next)
  45. {
  46. int v=e[i].to;
  47. if(!dfn[v])
  48. {
  49. Tarjan(v);
  50. low[u]=min(low[u],low[v]);
  51. }
  52. else
  53. if(vis[v])
  54. {
  55. low[u]=min(low[u],dfn[v]);
  56. }
  57. }
  58. if(dfn[u]==low[u])
  59. {
  60. col++;
  61. while(st[top+]!=u)
  62. {
  63. sum[col]+=money[st[top]];//计算此强连通分量的总价值
  64. co[st[top]]=col;
  65. vis[st[top--]]=;
  66. }
  67. }
  68. }
  69. void SPFA()//标准SPFA
  70. {
  71. memset(dis,,sizeof(dis));
  72. dis[co[s]]=-sum[co[s]];//负权
  73. q[]=co[s];//把市中心所在的点入队
  74. t=;
  75. w=;
  76. while(t<w)
  77. {
  78. t++;
  79. int u=q[t];
  80. exist[u]=;
  81. for(int i=h[u];i;i=e[i].next)
  82. {
  83. int v=e[i].to;
  84. if(dis[v]>dis[u]+e[i].w)
  85. {
  86. dis[v]=dis[u]+e[i].w;
  87. if(!exist[v])
  88. {
  89. w++;
  90. q[w]=v;
  91. exist[v]=;
  92. }
  93. }
  94. }
  95. }
  96. }
  97. int main()
  98. {
  99. read();
  100. for(int i=;i<=n;i++)
  101. if(!dfn[i]) Tarjan(i);
  102. cnt=;
  103. memset(e,,sizeof(e));
  104. memset(h,,sizeof(h));//注意清空边
  105. for(int i=;i<=m;i++)
  106. if(co[x[i]]!=co[y[i]])
  107. Add(co[x[i]],co[y[i]],-sum[co[y[i]]]);//负权边
  108. SPFA();
  109. cin>>p;
  110. for(int i=;i<=p;i++)//枚举所有酒吧求最大值
  111. {
  112. int bar;
  113. cin>>bar;
  114. if(-dis[co[bar]]>ans)
  115. ans=-dis[co[bar]];
  116. }
  117. cout<<ans;
  118. }

【题解】洛谷P3627 [APIO2009]抢掠计划(缩点+SPFA)的更多相关文章

  1. 洛谷 P3627 [APIO2009]抢掠计划 Tarjan缩点+Spfa求最长路

    题目地址:https://www.luogu.com.cn/problem/P3627 第一次寒假训练的结测题,思路本身不难,但对于我这个码力蒟蒻来说实现难度不小-考试时肛了将近两个半小时才刚肛出来. ...

  2. 洛谷 P3627 [APIO2009]抢掠计划 题解

    Analysis 建图+强连通分量+SPFA求最长路 但要保证最后到达的点中包含酒馆 虽然思路并不难想,但要求的代码能力很高. #include<iostream> #include< ...

  3. [洛谷P3627][APIO2009]抢掠计划

    题目大意:给你一张$n(n\leqslant5\times10^5)$个点$m(m\leqslant5\times10^5)$条边的有向图,有点权,给你起点和一些可能的终点.问从起点开始,到任意一个终 ...

  4. 洛谷 P3627 [APIO2009]抢掠计划

    这题一看就是缩点,但是缩完点怎么办呢?首先我们把所有的包含酒吧的缩点找出来,打上标记,然后建立一张新图, 每个缩点上的点权就是他所包含的所有点的点权和.但是建图的时候要注意,每一对缩点之间可能有多条边 ...

  5. 洛谷 P3627 【抢掠计划】

    题库:洛谷 题号:3627 题目:抢掠计划 link:https://www.luogu.org/problem/P3627 思路 : 这道题是一道Tarjan + 最长路的题.首先,我们用Tarja ...

  6. BZOJ1179或洛谷3672 [APIO2009]抢掠计划

    BZOJ原题链接 洛谷原题链接 在一个强连通分量里的\(ATM\)机显然都可被抢,所以先用\(tarjan\)找强连通分量并缩点,在缩点的后的\(DAG\)上跑最长路,然后扫一遍酒吧记录答案即可. # ...

  7. 洛谷3627 [APIO2009]抢掠计划

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

  8. P3627 [APIO2009]抢掠计划

    P3627 [APIO2009]抢掠计划 Tarjan缩点+最短(最长)路 显然的缩点...... 在缩点时,顺便维护每个强连通分量的总权值 缩完点按照惯例建个新图 然后跑一遍spfa最长路,枚举每个 ...

  9. 洛谷 P3627 [APIO2009](抢掠计划 缩点+spfa)

    题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri 的酒吧也都设 ...

随机推荐

  1. 解决 command not found: express

    需要先执行 sudo npm install -g express-generator 再安装 sudo npm install -g express 建立项目骨架 express -e   xxx

  2. c#输入方法名来调用方法(反射)

    using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...

  3. http反向代理之haproxy详解

    1.反向代理定义 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求 ...

  4. spring 依赖注入总结--为什么官方推荐构造器注入

    一 公司小伙伴使用了构造器注入,说是spring的官方推荐.但是,我问了三个问题,他都答不出来,感觉能写篇博文. 官方为什么推荐构造器注入? 构造器注入和属性注入的区别是啥? 你知道有几种注入方式吗? ...

  5. linux服务器git pull/push时避免频繁输入账号密码

    1.先cd到根目录,执行git config --global credential.helper store命令 [root@iZ25mi9h7ayZ ~]# git config --global ...

  6. 【VirtualBox】快照

    一.快照备份 虚拟机系统快照下来,以后就可以恢复到快照之前的系统 右上角->虚拟电脑工具->快照

  7. smarty中函数的使用以及二维数组的使用

    1.虽然讲究前后台分离,但是如果如果有的项目,前后台分离的不彻底,或者有些必须要在HTML中处理,还是要用到PHP中的函数的: <% if $Role|in_array:$menuRole[$c ...

  8. 04.Path类的学习

    path 是路径的意思. path类是一个静态类,所以path是一个工具类. Path类是专门用来操作路径的. Path的常用方法: namespace _15.Path类的学习 { class Pr ...

  9. 希尔排序——Java实现

    一.排序思想 希尔排序(Shell’s Sort)是插入排序的一种,是直接插入排序算法的一种更高版本的改进版本. 把记录按步长gap分组,对每组记录采用直接插入排序方法进行排序: 随着步长逐渐减小,所 ...

  10. SQLAlchemy的使用---M2M增删改查

    from sqlalchemy.orm import sessionmaker from sqlalchemy_M2M import engine, Girls, Boys Session = ses ...