[APIO2009]抢掠计划

题目描述

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

Banditji 计划实施 Siruseri 有史以来最惊天动地的 ATM 抢劫。他将从市中心 出发,沿着单向道路行驶,抢劫所有他途径的 ATM 机,最终他将在一个酒吧庆 祝他的胜利。

使用高超的黑客技术,他获知了每个 ATM 机中可以掠取的现金数额。他希 望你帮助他计算从市中心出发最后到达某个酒吧时最多能抢劫的现金总数。他可 以经过同一路口或道路任意多次。但只要他抢劫过某个 ATM 机后,该 ATM 机 里面就不会再有钱了。 例如,假设该城中有 6 个路口,道路的连接情况如下图所示:

市中心在路口 1,由一个入口符号→来标识,那些有酒吧的路口用双圈来表

示。每个 ATM 机中可取的钱数标在了路口的上方。在这个例子中,Banditji 能抢 劫的现金总数为 47,实施的抢劫路线是:1-2-4-1-2-3-5。

输入输出格式

输入格式:

第一行包含两个整数 N、M。N 表示路口的个数,M 表示道路条数。接下来 M 行,每行两个整数,这两个整数都在 1 到 N 之间,第 i+1 行的两个整数表示第 i 条道路的起点和终点的路口编号。接下来 N 行,每行一个整数,按顺序表示每 个路口处的 ATM 机中的钱数。接下来一行包含两个整数 S、P,S 表示市中心的 编号,也就是出发的路口。P 表示酒吧数目。接下来的一行中有 P 个整数,表示 P 个有酒吧的路口的编号。

输出格式:

输出一个整数,表示 Banditji 从市中心开始到某个酒吧结束所能抢劫的最多 的现金总数。

输入输出样例

输入样例#1:

6 7

1 2

2 3

3 5

2 4

4 1

2 6

6 5

10

12

8

16

1

5

1 4

4 3 5 6

输出样例#1:

47

说明

50%的输入保证 N, M<=3000。所有的输入保证 N, M<=500000。每个 ATM 机中可取的钱数为一个非负整数且不超过 4000。

输入数据保证你可以从市中心 沿着 Siruseri 的单向的道路到达其中的至少一个酒吧。

一道水题,裸的tarjan和spfa。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. int n,m,s,p,qnum,top,visnum,cnt;
  7. int head[500010],a[500010],low[500010],dfn[500010],st[500010],in[500010],belong[500010],sum[500010],dis[500010],x[500010],y[500010];
  8. struct node{
  9. int v,to,next;
  10. }edge[1000010];
  11. void add(int x,int y)
  12. {
  13. cnt++;
  14. edge[cnt].to=y;
  15. edge[cnt].next=head[x];
  16. head[x]=cnt;
  17. }
  18. int read()
  19. {
  20. int x=0,w=1;char ch=getchar();
  21. while(ch>'9'||ch<'0') {if(ch=='-')w=-1;ch=getchar();}
  22. while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
  23. return x*w;
  24. }
  25. void tarjan(int k)
  26. {
  27. int v;
  28. dfn[k]=low[k]=++visnum;
  29. in[k]=1;
  30. st[++top]=k;
  31. for(int i=head[k];i;i=edge[i].next)
  32. {
  33. v=edge[i].to;
  34. if(!dfn[v])
  35. {
  36. tarjan(v);
  37. low[k]=min(low[v],low[k]);
  38. }
  39. else if(in[v])
  40. {
  41. low[k]=min(low[k],dfn[v]);
  42. }
  43. }
  44. v=0;
  45. if(dfn[k]==low[k])
  46. {
  47. qnum++;
  48. do
  49. {
  50. v=st[top--];
  51. in[v]=0;
  52. belong[v]=qnum;
  53. sum[qnum]+=a[v];
  54. }while(v!=k);
  55. }
  56. }
  57. void spfa()
  58. {
  59. int l=0,r=1,k,v;
  60. st[1]=s;in[s]=1,dis[s]=sum[s];
  61. while(l<r)
  62. {
  63. l++;
  64. k=st[l];
  65. in[k]=0;
  66. for(int i=head[k];i;i=edge[i].next)
  67. {
  68. v=edge[i].to;
  69. if(dis[k]+sum[v]>dis[v])
  70. {
  71. dis[v]=dis[k]+sum[v];
  72. if(!in[v])
  73. {
  74. r++;
  75. st[r]=v;
  76. in[v]=1;
  77. }
  78. }
  79. }
  80. }
  81. }
  82. int main()
  83. {
  84. int z;
  85. n=read();m=read();
  86. for(int i=1;i<=m;i++)
  87. {
  88. x[i]=read();y[i]=read();
  89. add(x[i],y[i]);
  90. }
  91. for(int i=1;i<=n;i++)
  92. {
  93. a[i]=read();
  94. }
  95. s=read();p=read();
  96. for(int i=1;i<=n;i++)
  97. {
  98. if(!dfn[i])
  99. tarjan(i);
  100. }
  101. s=belong[s];
  102. memset(head,0,sizeof(head));
  103. cnt=0;
  104. for(int i=1;i<=m;i++)
  105. {
  106. if(belong[x[i]]!=belong[y[i]])
  107. add(belong[x[i]],belong[y[i]]);
  108. }
  109. memset(st,0,sizeof(st));
  110. memset(in,0,sizeof(in));
  111. spfa();
  112. int ans=0;
  113. for(int i=1;i<=p;i++)
  114. {
  115. z=read();
  116. ans=max(ans,dis[belong[z]]);
  117. }
  118. cout<<ans;
  119. }

[APIO2009]抢掠计划(Tarjan,SPFA)的更多相关文章

  1. APIO2009 抢掠计划 Tarjan DAG-DP

    APIO2009 抢掠计划 Tarjan spfa/DAG-DP 题面 一道\(Tarjan\)缩点水题.因为可以反复经过节点,所以把一个联通快中的所有路口看做一个整体,缩点后直接跑\(spfa\)或 ...

  2. [APIO2009]抢掠计划 tarjan缩点+spfa BZOJ1179

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

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

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

  4. [luogu3627 APIO2009] 抢掠计划 (tarjan缩点+spfa最长路)

    传送门 Description Input 第一行包含两个整数 N.M.N 表示路口的个数,M 表示道路条数.接下来 M 行,每行两个整数,这两个整数都在 1 到 N 之间,第 i+1 行的两个整数表 ...

  5. [APIO2009]抢掠计划 ($Tarjan$,最长路)

    题目链接 Solution 裸题诶... 直接 \(Tarjan\) 缩点+ \(SPFA\) 最长路即可. 不过在洛谷上莫名被卡... RE两个点... Code #include<bits/ ...

  6. P3627 [APIO2009]抢掠计划

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

  7. 题解 P3627 【[APIO2009]抢掠计划】

    咕了四个小时整整一晚上 P3627 [APIO2009] 抢掠计划(https://www.luogu.org/problemnew/show/P3627) 不难看出答案即为该有向图的最长链长度(允许 ...

  8. 【洛谷P3627】[APIO2009]抢掠计划

    抢掠计划 题目链接 比较水的缩点模板题,Tarjan缩点,重新建图,记录联通块的钱数.是否有酒吧 DAG上记忆化搜索即可 #include<iostream> #include<cs ...

  9. Tarjan缩点+Spfa最长路【p3627】[APIO2009] 抢掠计划

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

随机推荐

  1. 10.1 ‘The server's host key is not cached in the registry’

    10.1 ‘The server's host key is not cached in the registry’ This error message occurs when PuTTY conn ...

  2. PJSIP库设置Via地址

    好记性不如烂笔头,解决项目问题,调试代码跟踪到PJSIP 设置Via地址位置,记录下来,以备后用. PJSIP库在方法stateless_send_transport_cb中设置Via地址值,该方法在 ...

  3. Flask中的路由配置

    在Flask中也同样有django中的路由配置只不过没有djngo那么严格主要的参数有一下六个记住常用的就可以了 1.endpoint   反向生成url地址标志,默认视图函数名 2.methods ...

  4. .net 4.5 Test Async Task 异步测试

    using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using Syst ...

  5. 九、MySQL报错( (1292, u"Truncated incorrect DOUBLE value: '424a000000066'") result = self._query(query))

    1.数据库sql语句:SELECT seat_id FROM netsale_order_seat os join netsale_order nor on os.order_code=nor.ord ...

  6. Map 接口有哪些类

    Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value:Map中的键值对以Entry类型的对象实例形式存在:建(key值)不 ...

  7. jmeter模拟spike尖峰测

    jmeter模拟spike尖峰测试 概述 尖峰测试(Spike testing)在性能测试中属于压力测试的一个子集.指的是在某一瞬间或者多个频次下用户数和压力陡然增加的场景. 为了验证我们的网站在访问 ...

  8. xmake-vscode插件开发过程记录

    最近打算给xmake写一些IDE和编辑器的集成插件,发现vscode的编辑器插件比较容易上手的,就先研究了下vscode的插件开发流程,并且完成了xmake-vscode插件的开发. 我们先来看几张最 ...

  9. web service接口 wsdl和asmx有什么区别

    没有区别,只是后缀名的区别.Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立 ...

  10. BP神经网络反向传播之计算过程分解(详细版)

    摘要:本文先从梯度下降法的理论推导开始,说明梯度下降法为什么能够求得函数的局部极小值.通过两个小例子,说明梯度下降法求解极限值实现过程.在通过分解BP神经网络,详细说明梯度下降法在神经网络的运算过程, ...