ATM

Time Limit: 15 Sec
Memory Limit: 162 MB

Description
Siruseri城中的道路都是单向的。不同的道路由路口连接。按照法律规定,在每个路口都设立了一个Siruseri银行的ATM取款机。令人奇怪的是,Siruseri的酒吧都设在路口,虽然并不是每个路口都设有酒吧。
Banditiji计划实施Siruseri有史以来最惊天动地的ATM抢劫。他将从市中心出发,沿着单向道路行驶,抢劫所有他途径的ATM机,最终他将在一个酒吧庆祝他的胜利。
使用高超的黑客技术,他获知了每个ATM机中可以掠取的现金数额。他希望你帮助他计算从市中心出发最后到达某酒吧时最多能抢劫的现金数额。他希望你帮助他计算从市中心出发最后到达某个酒吧时最多能抢劫的现金总数。他可以经过同一路口或道路任意多次。但只要他抢劫某个ATM机后,该ATM机就不会再有钱了。

Input
第一行包含两个整数N、M。N表示路口的个数,M表示道路条数。接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号。接下来N行,每行一个整数,按顺序表示每个路口处的ATM机中的钱数。接下来一行包含两个整数S、P,S表示市中心的编号,也就是出发的路口。P表示酒吧数目。接下来的一行中有P个整数,表示P个有酒吧的路口的编号
Output
输出一个整数,表示Banditji从市中心开始到某个酒吧结束所能抢劫的最多的现金总数。

Sample Input
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
Sample Output
47

HINT
50%的输入保证N, M<=3000。
所有的输入保证N, M<=500000。
每个ATM机中可取的钱数为一个非负整数且不超过4000。
输入数据保证你可以从市中心沿着Siruseri的单向的道路到达其中的至少一个酒吧。

标签:Tarjan

题面有一种莫名其妙的喜感
这道题是我的第一道APIO题(虽然是水题),庆祝一下
首先,很容易看出要tarjan缩点。题目说城市的路是单向边,而且可以经过任意一点任意多次,所以走到强连通分量,这个强连通分量的所有点都可以到达,所有ATM机都可以抢。
于是我们先缩点,顺带记录每个分量的ATM机价值总和,并统计每个分量有没有酒吧,即能否作为停止点。然后跑一遍SPFA,找以所有带酒吧的分量为终点的最长路即可。
五十行随便写完,数据无坑。

附上AC代码:

#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#define MAX_N 500000
using namespace std;
int n, m, s, p, c[MAX_N+5], end[MAX_N+5], endc[MAX_N+5], dfn[MAX_N+5], low[MAX_N+5], id[MAX_N+5], sz[MAX_N+5], ind, cnt;
vector <int> G[MAX_N+5], E[MAX_N+5];
stack <int> sta;    bool insta[MAX_N+5];
void tarjan(int u) {dfn[u] = low[u] = ++ind, sta.push(u), insta[u] = true;for (int i = 0; i < G[u].size(); i++) {int v = G[u][i];if (!dfn[v])    tarjan(v), low[u] = min(low[u], low[v]);else if (insta[v])  low[u] = min(low[u], dfn[v]);}if (dfn[u] == low[u]) {cnt++;for (int i = sta.top(); ; i = sta.top()) {id[i] = cnt, sz[cnt] += c[i], insta[i] = false;sta.pop();  if (i == u) break;}}
}
queue <int> que;    bool inque[MAX_N+5];    int f[MAX_N+5], ans;
void SPFA() {f[s] = sz[s], que.push(s), inque[s] = true;while (!que.empty()) {int u = que.front();    que.pop(), inque[u] = false;for (int i = 0; i < E[u].size(); i++) {int v = E[u][i];    if (f[v] > f[u]+sz[v])  continue;f[v] = f[u]+sz[v];  if (!inque[v])  que.push(v), inque[v] = true;if (endc[v])    ans = max(ans, f[v]);}}
}
int main() {scanf("%d%d", &n, &m);while (m--) {int u, v;  scanf("%d%d", &u, &v), G[u].push_back(v);}for (int i = 1; i <= n; i++)    scanf("%d", &c[i]);scanf("%d%d", &s, &p);while (p--) {int x; scanf("%d", &x), end[x] = 1;}for (int i = 1; i <= n; i++)    if (!dfn[i])    tarjan(i);for (int i = 1; i <= n; i++)    endc[id[i]] |= end[i];for (int u = 1; u <= n; u++)    for (int i = 0; i < G[u].size(); i++) {int v = G[u][i]; if (id[u] != id[v]) E[id[u]].push_back(id[v]);}s = id[s], SPFA();printf("%d", ans);return 0;
}

BZOJ1179【APOI2009】ATM Tarjan相关推荐

  1. 【POJ2117】Electricity [tarjan 割点]

    2117 -- Electricity 一个无向图 去掉一个点后最多能被分为多少个部分 输入要注意是n m同时为0才停.... n,m可能有一个为零 别问我为什么知道... 其实每太弄懂.....再看 ...

  2. 【笔记】2-SAT (tarjan)

    TWO-SAT略解: Part 1 (引入): 其实2-SAT是用来解决一系列类似如果我怎么怎么样,他就怎么怎么怎么样的东西,具体来说就是只有两种状态,两种状态不能兼得. 举个例子: \(A\) 说如 ...

  3. 【软件工程】5 ATM系统测试

    目录 5 ATM系统测试 5.1 单元测试 5.1.1 制定单元测试计划 5.1.2 设计单元测试用例 ​编辑 5.1.3 执行单元测试 5.1.4 单元测试报告 5.2 集成测试 5.2.1 制定集 ...

  4. 【BZOJ2140】稳定婚姻 Tarjan

    [BZOJ2140]稳定婚姻 Description 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. ...

  5. 【图论】Tarjan 缩点

    [Tarjan]缩点 在一个点N数据极大的图中,直接SPFA或者记忆花搜索时间超限,那么我们可以利用Tarjan缩点来减少N. 举个例子: 如上图:3,6两点为该图中的强连通分量,我们可以将它们看做一 ...

  6. 【codevs2822】爱在心中 tarjan 缩点+理解

    [codevs2822]爱在心中 2014年1月26日5580 题目描述 Description "每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡 ...

  7. 【原创】tarjan算法初步(强连通子图缩点)

    [原创]tarjan算法初步(强连通子图缩点) tarjan算法的思路不是一般的绕!!(不过既然是求强连通子图这样的回路也就可以稍微原谅了..) 但是研究tarjan之前总得知道强连通分量是什么吧.. ...

  8. 洛谷 P3388 【模板】割点(割顶) 根+非根+dfn[]+low[]+不一样的Tarjan算法

    洛谷  P3388 [模板]割点(割顶)  根+非根+dfn[]+low[]+不一样的Tarjan算法 Tarjan算法,详见https://blog.csdn.net/mrcrack/article ...

  9. P3387 【模板】缩点 Tarjan强连通分量/树上dp

    P3387 [模板]缩点 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 首先,什么是强连通分量 极大强连通子图 叫做强连通分量             首先要明确,         ...

最新文章

  1. Java 8默认方法可能会破坏您的(用户)代码
  2. Python-体育竞技模拟
  3. oui unknown中的oui是什么?
  4. python scipy stats_Python Scipy stats.binned_statistic_dd()用法及代码示例
  5. 收集几个AS3频谱代码SoundMixer.ComputeSpectrum()
  6. [转载] Python中pandas dataframe删除一行或一列:drop函数
  7. python-视频抽帧、数据集命名
  8. 2015最新Linkedin人才趋势报告
  9. WM 仓库管理T-CODE
  10. ie11代理服务器不能修改,ie11浏览器主页无法修改
  11. SpringBoot集成海康威视Linux版本
  12. Unity获取IOS端相机权限的状态
  13. 以桨为楫 修己度人(一)
  14. HDU 2565 放大的X【图形】
  15. SpringSecurity 安全框架
  16. 组合数学之放球问题 【附斯特林数】
  17. python中文朗读_python语音朗读
  18. 深度学习笔记(入门)
  19. SAP MM 执行事务代码VL10B 报错-4501378483 000010 Only 0 CS of material ### available-
  20. pythonttf字体反爬虫_利用Python采集起点中文网小说,并解决字体反爬的问题

热门文章

  1. bootstrapt 表格自适应_好用的自适应表格插件-bootstrap table (支持固定表头)
  2. 4.19 亿条 Facebook 用户账号及电话号码被泄露【智能快讯】
  3. 单机版五子棋java功能_JAVA单机版五子棋怎么写
  4. 最新版qq空间刷留言小秘书 V1.20 正式版
  5. 1548_AURIX_TC275_锁步比较逻辑LCL
  6. 赏完超级蓝血月,再来品味这10个与月亮有关的创业项目
  7. A股常用指数历史成分股数据Web API
  8. UVA1203 Argus
  9. Win10休眠模式设置:开机后自动恢复工作界面,防止程序员虐待电脑
  10. EntityFrameWork Core从零开始,(九)继承影射的补充