题目描述

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 的单向的道路到达其中的至少一个酒吧。

把一个强连通分量缩成一个点,判断每个点内有没有酒吧,搞两个dfs就好了。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define M 600010
 5 using namespace std;
 6 struct point{
 7     int next,to;
 8 }e[M];
 9 int n,m,num,top,cnt,tot,P,S;
10 int dfn[M],low[M],co[M],st[M],head[M];
11 int sum[M],f[M],val[M],a[M],b[M];
12 bool vis[M],bar[M],can[M];
13 void add(int from,int to)
14 {
15     e[++num].next=head[from];
16     e[num].to=to;
17     head[from]=num;
18 }
19 void tarjan(int x)
20 {
21     dfn[x]=low[x]=++cnt;
22     st[++top]=x;
23     vis[x]=true;
24     for(int i=head[x];i;i=e[i].next)
25     {
26         int to=e[i].to;
27         if(!dfn[to])
28         {
29             tarjan(to);
30             low[x]=min(low[x],low[to]);
31         }
32         else if(vis[to]) low[x]=min(low[x],dfn[to]);
33     }
34     if(dfn[x]==low[x])
35     {
36         tot++;
37         while(st[top+1]!=x)
38         {
39             co[st[top]]=tot;
40             vis[st[top]]=false;
41             sum[tot]+=val[st[top]];
42             if(bar[st[top]]) can[tot]=true;
43             top--;
44         }
45     }
46 }
47 void check(int x)
48 {
49     vis[x]=true;
50     for(int i=head[x];i;i=e[i].next)
51     {
52         int to=e[i].to;
53         if(!vis[to]) check(to);
54         if(can[to]) can[x]=true;
55     }
56 }
57 void dfs(int x)
58 {
59     f[x]=sum[x];
60     int maxn=0;
61     for(int i=head[x];i;i=e[i].next)
62     {
63         int to=e[i].to;
64         if(!can[to]) continue;
65         if(!f[to]) dfs(to);
66         maxn=max(maxn,f[to]);
67     }
68     f[x]+=maxn;
69 }
70 int main()
71 {
72     scanf("%d%d",&n,&m);
73     for(int i=1;i<=m;i++)
74     {
75         scanf("%d%d",&a[i],&b[i]);
76         add(a[i],b[i]);
77     }
78     for(int i=1;i<=n;i++) scanf("%d",&val[i]);
79     scanf("%d%d",&S,&P);
80     for(int i=1;i<=P;i++)
81     {
82         int x;scanf("%d",&x);
83         bar[x]=true;
84     }
85     tarjan(S);
86     num=0;
87     memset(e,0,sizeof(e));
88     memset(head,0,sizeof(head));
89     memset(vis,false,sizeof(vis));
90     for(int i=1;i<=m;i++)
91         if(co[a[i]]!=co[b[i]]&&co[a[i]]&&co[b[i]])
92             add(co[a[i]],co[b[i]]);
93     check(co[S]);
94     dfs(co[S]);
95     printf("%d",f[co[S]]);
96     return 0;
97 }

转载于:https://www.cnblogs.com/Slrslr/p/9502784.html

[APIO2009]抢掠计划相关推荐

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

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

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

    题目链接:https://www.luogu.org/problemnew/show/P3627 把点权转化到边权上去. #include <stack> #include <que ...

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

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

  4. acmore|acmore.cc1211采油区域1212会议中心1213抢掠计划APIO2009

    采油区域: #include <iostream> #include <algorithm> #include <cstdio> #include <cstd ...

  5. bzoj 1179 抢掠计划atm (缩点+有向无环图DP)

    bzoj 1179 抢掠计划atm (缩点+有向无环图DP) 手动博客搬家: 本文发表于20170716 10:58:18, 原地址https://blog.csdn.net/suncongbo/ar ...

  6. 【BZOJ1179】[Apio2009]Atm/抢掠计划

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

  7. 【APIO2009-3】抢掠计划

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

  8. 非递归!APIO2009atm[抢掠计划]题解

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

  9. SCAU-春季训练-不应该啊(怎么这么菜。。。)

    2021/3/14 春季训练2(难度div2d) 反思:(赛前,看什么crt,赛时满脑子都是线性方程组,....................................) 最近表现都不太好.. ...

最新文章

  1. module ‘pytest‘ has no attribute ‘allure‘问题解决
  2. 伤害世界怎么自建服务器,Hurtworld伤害世界服务器怎么架设?服务器架设图文教程...
  3. 利用@media screen实现网页布局的自适应
  4. 2017.9.10 序列操作 思考记录
  5. vue.js页面刷新出现闪烁问题的解决
  6. 在抖音上,你只要会装穷,会装富,会吹牛逼,会包装自己,会扯淡,那翻身就指日可待了
  7. web 实现分页打印功能
  8. 数据结构:二叉查找树
  9. 软件测试理论-测试用例和设计方法
  10. [系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向
  11. 01-msm8953 单独编译bootloader、kernel和system,以及采用adb fastboot下载镜像的方法
  12. 菜鸟的Springboot学习日历(一)
  13. 好用到爆!IDEA 版 Postman 面世了,功能真心强大
  14. Cocos Creator 随笔(1)-- 世界坐标,相对坐标转换问题
  15. Visual studio 2017中 Javascript对于Xrm对象模型没有智能提示的解决办法
  16. IDEA离线插件安装包下载方法
  17. 《计算机网络》学习笔记----第七版课后习题参考答案 第四章
  18. Linux 电脑系统基本操作
  19. 服务端没有 listen,客户端发起连接建立,会发生什么?
  20. 能批量管理大量电脑文件的工具

热门文章

  1. mysql查询语句理解
  2. Laravel5.2之模型关联预加载
  3. Windows Restart Manager 重启管理器
  4. Prism4翻译笔记(四)第四章:模块化应用程序开发
  5. python如何制作一个工程软件_使用python制作一个解压缩软件
  6. android 多线程类,Android 多线程处理之多线程用法大集合
  7. android texturevideoview 缓存,Android TextureView与VideoView性能
  8. SAP License:物料类型的划分标准
  9. SAP License:关于SAP 对生产订单的月度结算
  10. B端评分卡在中小企业贷款中使用的三个阶段