Description

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要爆栈,实用性不是很强,需要用网上的这个非递归版tarjan
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
using namespace std;
const int maxn = ;
struct edge{
int v;
int nxt;
}e[maxn];
int n,m,s,p,mny[maxn],nmny[maxn];
int head[maxn],cnt;
int stop,sta[maxn],dfn[maxn],low[maxn],isin[maxn],indx;
int tot;
int d[maxn],vis[maxn];
bool inst[maxn];
stack<int> st;
vector<int> g[maxn];
int read(){
char ch=getchar();
int x=,f=;
while(!(ch>=''&&ch<='')){if(ch=='-')f=-;ch=getchar();};
while(ch>=''&&ch<=''){x=x*+(ch-'');ch=getchar();};
return x*f;
}
void ins(int u,int v){
cnt++;
e[cnt].v = v;
e[cnt].nxt = head[u];
head[u] = cnt;
}
void input(){
n = read();
m = read();
int u,v;
for(int i = ;i <= m;i++){
u = read();
v = read();
ins(u,v);
}
for(int i = ;i <= n;i++) mny[i] = read();
s = read();
p = read();
}
void st_psh(int x){
dfn[x] = low[x] = ++indx;
inst[x] = true;
sta[++stop] = x;
st.push(x);
}
void tarjan(int x){
int t;
st_psh(x);
while(!st.empty()){
t = st.top();
for(int i = head[t];i;i = e[i].nxt){
if(dfn[e[i].v] == ){
st_psh(e[i].v);
break;
}
}
if(t == st.top()){
for(int i = head[t];i;i = e[i].nxt){
if(dfn[e[i].v] > dfn[t]) low[t] = min(low[e[i].v],low[t]);
else if(inst[e[i].v]){low[t] = min(dfn[e[i].v],low[t]);}
}
if(dfn[t] == low[t]){
++tot;
int j;
do{
j = sta[stop--];
inst[j] = false;
isin[j] = tot;
nmny[tot] += mny[j];
}while(j != t);
}
st.pop();
}
}
}
void spfa(){
int u,to;
queue<int> q;
u = isin[s];
d[isin[s]] = nmny[isin[s]];
vis[isin[s]] = true;
q.push(isin[s]);
while(!q.empty()){
u = q.front();
q.pop();
for(int i = ;i < g[u].size();i++){
to = g[u][i];
if(d[to] < d[u] + nmny[to]){
d[to] = d[u] + nmny[to];
if(!vis[to]){
vis[to] = true;
q.push(to);
}
}
}
vis[u] = false;
}
}
void work(){
for(int i = ;i <= n;i++){
if(!dfn[i]) tarjan(i);
}
for(int i = ;i <= n;i++){
for(int j = head[i];j;j = e[j].nxt){
if(isin[i] != isin[e[j].v]){
g[isin[i]].push_back(isin[e[j].v]);
//cout<<isin[i]<<" "<<isin[e[j].v]<<endl;
}
}
}
spfa();
int qs,ans = ;
while(p--){
qs = read();
ans = max(d[isin[qs]],ans);
}
cout<<ans;
}
int main(){
input();
work();
return ;
}

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

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

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

  2. BZOJ1179 : [Apio2009]Atm 缩点+spfa

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

  3. BZOJ1179 [Apio2009]Atm Tarjan 强连通缩点 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1179 题意概括 有一个有向图,每一个节点有一个权值,其中有一些结束点. 现在,你要从S出发,到达任 ...

  4. bzoj1179: [Apio2009]Atm 【缩点+spfa最长路】

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

  5. 【强连通分量+spfa】Bzoj1179 Apio2009 Atm

    Description Solution 显然缩强连通分量,然后求最长路,虽然是DAG但还是有点麻烦,于是用了spfa. Code 重建图_数组写错好多次,感觉做这题也就是练了一下实现. #inclu ...

  6. bzoj1179: [Apio2009]Atm scc缩点+dag上dp

    先把强连通缩点,然后变成了dag,dp求终点是酒吧的最长路即可, /************************************************************** Pro ...

  7. 【强联通分量缩点】【最短路】【spfa】bzoj1179 [Apio2009]Atm

    缩点后转化成 DAG图上的单源最长路问题.spfa/dp随便. #include<cstdio> #include<queue> #include<algorithm&g ...

  8. [BZOJ1179] [Apio2009]Atm(tarjan缩点 + spfa)

    传送门 题意 N个点M条边的有向图 每个点有点权 从某一个结点出发 问能获得的最大点权和 一个点的点权最多被计算一次 N<=500000 M<=500000 思路 先tarjan缩点,然后 ...

  9. bzoj1179 [Apio2009]Atm——缩环最长路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1179 tarjan 缩环,然后求到有酒吧的点的最长路即可: 但一开始想缩环后用拓扑序求答案, ...

随机推荐

  1. Discuz! X2.5 /source/class/helper/helper_seo.php Remote Code Execution Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 SEO模块中的preg_replace+修正符e+双引号引发的远程代码执 ...

  2. How to Prevent Cross-Site Scripting Attacks

    How to Prevent Cross-Site Scripting Attacks Reference From: http://resources.infosecinstitute.com/ho ...

  3. 帝国CMS文章随机调用等一些常用标签

    1.帝国CMS文章随机调用等一些常用标签 [e:loop={'news',10,18,0,'newstime>UNIX_TIMESTAMP()-86400*7','onclick desc'}] ...

  4. Beta Daily Scrum 第三天

    [目录] 1.任务进度 2.困难及解决 3.燃尽图 4.代码check-in 5.总结 1. 任务进度 学号 今日完成 明日完成 612 初步完成成就界面的统计图表 继续编写成就界面的图表 615 白 ...

  5. Beta版本——第六次冲刺博客

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...

  6. jQuery小技巧

    1. 禁止右键点击 $(document).bind("contextmenu",function(e){ return false; }); 2.隐藏搜索文本框文字 $(docu ...

  7. BZOJ2827: 千山鸟飞绝

    离散化坐标,每个坐标开一棵以鸟的编号为关键字的平衡树.每次插入时打2个标记,同时更新自身.这个方法比较显然,而且好写.正解好像用很迷的方法乱搞了一波,然后用线段树不打标记就做出来了,并不会. trea ...

  8. 分析setting源代码获取sd卡大小

    分析setting源代码获取sd卡大小 android系统有一个特点,即开源,我们可以得到任何一个应用的源代码,比如我们不知道这样的android代码怎么写,我们可以打开模拟器里面的设置(settin ...

  9. js 对象属性复制到另一个对象

    var obj={a:1,b:2,c:3} var newObj={};for(var i in obj){newObj[i]=obj[i];}console.log(newObj);

  10. StringBuffer类

    String的内容一旦声明则不可改变,如果改变,则改变的肯定是String的引用地址. 如果一个字符串要被经常改变,则就必须使用StringBuffer类. 在String类中可以通过“+”进行字符串 ...