*题目描述:

*输入:
第一行包含两个整数N、M。N表示路口的个数,M表示道路条数。接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号。接下来N行,每行一个整数,按顺序表示每个路口处的ATM机中的钱数。接下来一行包含两个整数S、P,S表示市中心的编号,也就是出发的路口。P表示酒吧数目。接下来的一行中有P个整数,表示P个有酒吧的路口的编号
*输出:
输出一个整数,表示Banditji从市中心开始到某个酒吧结束所能抢劫的最多的现金总数。
*样例输入:
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
样例输出:
47
*提示:
50%的输入保证N, M<=3000。所有的输入保证N, M<=500000。每个ATM机中可取的钱数为一个非负整数且不超过4000。输入数据保证你可以从市中心沿着Siruseri的单向的道路到达其中的至少一个酒吧。
*题解:
缩强+最短路。把强连通分量都缩起来,然后构造新图,求出新图点权的最长路即可。
*代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue> #ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif #ifdef CT
#define debug(...) printf(__VA_ARGS__)
#define setfile()
#else
#define debug(...)
#define filename ""
#define setfile() freopen(filename".in", "r", stdin); freopen(filename".out", "w", stdout);
#endif #define R register
#define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T) ? EOF : *S++)
#define dmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
#define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
#define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
#define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
char B[1 << 15], *S = B, *T = B;
inline int FastIn()
{
R char ch; R int cnt = 0; R bool minus = 0;
while (ch = getc(), (ch < '0' || ch > '9') && ch != '-') ;
ch == '-' ? minus = 1 : cnt = ch - '0';
while (ch = getc(), ch >= '0' && ch <= '9') cnt = cnt * 10 + ch - '0';
return minus ? -cnt : cnt;
}
#define maxn 500010
#define maxm 1000010
struct Edge
{
Edge *next;
int to;
}*last[maxn], e[maxm], *ecnt = e, *last2[maxn];
inline void link(R int a, R int b)
{
*++ecnt = (Edge) {last[b], a}; last[b] = ecnt;
}
inline void link2(R int a, R int b)
{
*++ecnt = (Edge) {last2[a], b}; last2[a] = ecnt;
}
int val[maxn], dfn[maxn], low[maxn], timer, st[maxn], stcnt, scc, id[maxn], sum[maxn];
void dfs(R int x)
{
dfn[x] = low[x] = ++timer;
st[++stcnt] = x;
for (R Edge *iter = last[x]; iter; iter = iter -> next)
{
R int pre = iter -> to;
if (!dfn[pre])
{
dfs(pre);
cmin(low[x], low[pre]);
}
else if (!id[pre]) cmin(low[x], dfn[pre]);
}
if (dfn[x] == low[x])
{
++scc;
for ( ; ; )
{
R int now = st[stcnt--];
id[now] = scc;
sum[scc] += val[now];
if (now == x) break;
}
}
}
int d[maxn];
#define inf 0x7fffffff
std::queue <int> q;
bool vis[maxn];
int main()
{
// setfile();
R int n = FastIn(), m = FastIn();
for (R int i = 1; i <= m; ++i)
link(FastIn(), FastIn());
for (R int i = 1; i <= n; ++i) val[i] = FastIn();
for (R int i = 1; i <= n; ++i) if (!dfn[i]) dfs(i);
for (R int i = 1; i <= n; ++i)
{
for (R Edge *iter = last[i]; iter; iter = iter -> next)
if (id[i] != id[iter -> to]) link2(id[i], id[iter -> to]);
}
for (R int i = 1; i <= scc; ++i) d[i] = -inf;
R int s = id[FastIn()], p = FastIn(), t = scc + 1;
for (R int i = 1; i <= p; ++i) link2(id[FastIn()], t);
d[s] = sum[s]; q.push(s);
while (!q.empty())
{
R int now = q.front(); q.pop();
for (R Edge *iter = last2[now]; iter; iter = iter -> next)
{
R int pre = iter -> to;
if (d[pre] < d[now] + sum[pre])
{
d[pre] = d[now] + sum[pre];
if (!vis[pre])
{
vis[pre] = 1;
q.push(pre);
}
}
}
vis[now] = 0;
}
printf("%d\n", d[t] );
return 0;
}

【bzoj1179】[Apio2009]Atm的更多相关文章

  1. 【BZOJ1179】 [Apio2009]Atm tarjan缩点+SPFA

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

  2. 【bzoj1179】 Apio2009—Atm

    www.lydsy.com/JudgeOnline/problem.php?id=1179 (题目链接) 题意 给出一张有向图,每个节点有点权.标记一些点,找出一条路径,可以重复经过一条边,使得总点权 ...

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

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

  4. 【BZOJ1179】[Apio2009]Atm (tarjan+SPFA)

    显而易见的tarjan+spfa...不解释了 ; type edgetype=record toward,next:longint; end; var edge1,edge2:..maxn] of ...

  5. 【Tarjan】+【SPFA】APIO2009 Atm

    一.算法介绍 tarjan——求解有向图强连通分量.这个算法在本人的一篇blog中有介绍,这里就不赘述了.贴上介绍tarjan的的blog链接:http://www.cnblogs.com/Maki- ...

  6. 【BZOJ-1179】Atm Tarjan + SPFA

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

  7. 【BZOJ 1179】[Apio2009]Atm

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] tarjan强连通缩点一下. 然后把缩点之后,每个点的钱的数累加起来. 然后从S出发 开始一边做bfs一遍做dp. 最后输出有酒吧的 ...

  8. 【题解】[APIO2009]会议中心

    [题解][P3626 APIO2009]会议中心 真的是一道好题!!!刷新了我对倍增浅显的认识. 此题若没有第二份输出一个字典序的方案,就是一道\(sort+\)贪心,但是第二问使得我们要用另外的办法 ...

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

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

随机推荐

  1. return语句

    定义一个函数:可以定义一个由自己想要功能的函数,以下是简单的规则: (1).函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(). (2).任何传入参数和自变量必须放在圆括号中间.圆括号之 ...

  2. js函数的定义和调用

    函数的定义 函数使用function 声明,后跟一组参数以及函数体,语法如下: function functionName([age0,age1,......argn]){ statements } ...

  3. [Jupyter Notebook] 01 这么多快捷键,我可顶不住!先记个八成吧

    0. 一些说明 为了入门 Python3 安装了 Anaconda,它集成了 Jupyter Notebook 1. 调出快捷键表 打开 Jupyter Notebook,新建一个 Python3(我 ...

  4. MySQL-快速入门(8)存储过程、存储函数

    1.存储过程 1>创建存储过程:create procedure create procedure sp_name ([in | out | inout] param_name type) [c ...

  5. JS中创建10个a标签,点击弹出对应的序号

    <script type="text/javascript"> for(var i=0;i<10;i++){ (function(i){ var a=docume ...

  6. Luogu P1315 [NOIP2012]观光公交

    题目 每次把加速器用在可以是答案减少最多的地方就即可.(这不是废话吗?) 具体而言,我们处理出: \(sum_i\)到\(i\)为止下车人数之和. \(t_i\)在\(i\)最晚的上车的人的上车时间. ...

  7. 分布式理论: CAP、BASE (转)

    分布式系统的CAP理论是由Eric Brewer于1999年首先提出的,又被称作布鲁尔定理(Brewer's theorem),CAP是对Consistency(一致性).Availability(可 ...

  8. Desert King(01分数规划问题)(最优斜率生成树)

    Desert King Time Limit: 3000MS   Memory Limit: 65536K Total Submissions:33847   Accepted: 9208 Descr ...

  9. 计算机系统结构总结_Instruction Set Architecture

    Textbook:<计算机组成与设计——硬件/软件接口>  HI<计算机体系结构——量化研究方法>          QR 这节我们来看CPU内部的一些东西. Instruct ...

  10. 轮播图--js课程

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...