[luogu3627 APIO2009] 抢掠计划 (tarjan缩点+spfa最长路)
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 的单向的道路到达其中的至少一个酒吧。
Solution
很显然先缩点然后直接跑最长路就行
Code
//By Menteur_Hxy
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define M(a,b) memset(a,(b),sizeof(a))
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define E(i,u) for(register int i=head[u];i;i=nxt[i])
using namespace std;
typedef long long LL;
int read() {
int x=0,f=1; char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x*f;
}
const int N=500010;
bool vis[N],in[N];
int n,m,cnt,st,pl,tot,top,col;
int fr[N],nxt[N],to[N],head[N],mo[N],dfn[N],low[N],sta[N],bl[N],sum[N],pla[N];
LL ans,dis[N];
vector <int> V[N];
void tarjan(int u) { int v;
dfn[u]=low[u]=++tot;
sta[++top]=u;in[u]=1;
E(i,u) if(!dfn[v=to[i]]) {
tarjan(v);
low[u]=min(low[u],low[v]);
} else if(in[v]) low[u]=min(low[u],dfn[v]);
if(dfn[u]==low[u]) {
col++;
while(sta[top]!=u) sum[col]+=mo[sta[top]],in[sta[top]]=0,bl[sta[top--]]=col;
sum[col]+=mo[sta[top]],in[sta[top]]=0,bl[sta[top--]]=col;
}
}
queue <int> Q;
void spfa(int x) {
M(dis,0x3f);
Q.push(x);vis[x]=1;
dis[x]=-sum[x];
while(!Q.empty()) {
int u=Q.front(),v; Q.pop();
int siz=V[u].size();
F(i,0,siz-1) if(dis[v=V[u][i]]>dis[u]-sum[v]) {
dis[v]=dis[u]-sum[v];
if(!vis[v]) Q.push(v),vis[v]=1;
}
vis[u]=0;
}
}
#define add(a,b) nxt[++cnt]=head[a],fr[cnt]=a,to[cnt]=b,head[a]=cnt
int main() {
n=read(),m=read();
F(i,1,m) {
int a=read(),b=read();
add(a,b);
}
F(i,1,n) mo[i]=read();
st=read(),pl=read();
F(i,1,pl) pla[i]=read();
tarjan(st);
F(i,1,m) { int u=fr[i],v=to[i];
if(bl[u]==bl[v]) continue;
V[bl[u]].push_back(bl[v]);
}
spfa(bl[st]);
F(i,1,pl) if(ans<(-dis[bl[pla[i]]])) ans=(-dis[bl[pla[i]]]);
printf("%lld",ans);
return 0;
}
[luogu3627 APIO2009] 抢掠计划 (tarjan缩点+spfa最长路)的更多相关文章
- 洛谷 P3627 [APIO2009]抢掠计划 Tarjan缩点+Spfa求最长路
题目地址:https://www.luogu.com.cn/problem/P3627 第一次寒假训练的结测题,思路本身不难,但对于我这个码力蒟蒻来说实现难度不小-考试时肛了将近两个半小时才刚肛出来. ...
- [APIO2009]抢掠计划 tarjan缩点+spfa BZOJ1179
题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri 的酒吧也都设 ...
- 【bzoj1179】[Apio2009]Atm Tarjan缩点+Spfa最长路
题目描述 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每 ...
- Tarjan缩点+Spfa最长路【p3627】[APIO2009] 抢掠计划
Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri ...
- 【题解】洛谷P3627 [APIO2009]抢掠计划(缩点+SPFA)
洛谷P3627:https://www.luogu.org/problemnew/show/P3627 思路 由于有强连通分量 所以我们可以想到先把整个图缩点 缩点完之后再建一次图 把点权改为边权 并 ...
- [APIO2009]抢掠计划 ($Tarjan$,最长路)
题目链接 Solution 裸题诶... 直接 \(Tarjan\) 缩点+ \(SPFA\) 最长路即可. 不过在洛谷上莫名被卡... RE两个点... Code #include<bits/ ...
- APIO2009 抢掠计划 Tarjan DAG-DP
APIO2009 抢掠计划 Tarjan spfa/DAG-DP 题面 一道\(Tarjan\)缩点水题.因为可以反复经过节点,所以把一个联通快中的所有路口看做一个整体,缩点后直接跑\(spfa\)或 ...
- [BZOJ1179] [Apio2009]Atm(tarjan缩点 + spfa)
传送门 题意 N个点M条边的有向图 每个点有点权 从某一个结点出发 问能获得的最大点权和 一个点的点权最多被计算一次 N<=500000 M<=500000 思路 先tarjan缩点,然后 ...
- 缩点+spfa最长路【bzoj】 1179: [Apio2009]Atm
[bzoj] 1179: [Apio2009]Atm Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri ...
随机推荐
- 利用junit对springMVC的Controller进行测试
本文转自http://www.tuicool.com/articles/7rMziy 平时对junit测试service/DAO层已经很熟悉不过了,如果不了解,可以猛戳这里,但是我们要测试contro ...
- Map 遍历取值及jstl的取值
Map 遍历取值及jstl的取值 学习了:http://blog.csdn.net/yanjiaye520/article/details/17354239 1.Java map的便利取值 Java代 ...
- Java中Void占位符的測试及个人理解
Java对Void类的说明是:Void 类是一个不可实例化的占位符类,它保持一个对代表 Java keyword void 的 Class 对象的引用. 代表的是: 代表主要的 Java 类型 voi ...
- 【JavaScript】在同一个网页中实现多个JavaScript特效
在网页中,假设出现两次<script type="text/javascript"></script>标签,全部的JavaScipt脚本都不会再生效,仅仅能 ...
- CentOS安装、配置APR和tomcat-native
APR:Apache Portable Run-time libraries,Apache可移植执行库 在早期的Apache版本号中.应用程序本身必须可以处理各种详细操作系统平台的细节,并针对不同的平 ...
- DDos攻击,使用深度学习中 栈式自编码的算法
转自:http://www.airghc.top/2016/11/10/Dection-DDos/ 最近研究了一篇论文,关于检测DDos攻击,使用了深度学习中 栈式自编码的算法,现在简要介绍一下内容论 ...
- nyoj--973--天下第一(SPFA判断负环)
天下第一 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 AC_Grazy一直对江湖羡慕不已,向往着大碗吃肉大碗喝酒的豪情,但是"人在江湖漂,怎能 不挨刀&qu ...
- 使用串口终端安装AIX操作系统
使用串口终端安装AIX操作系统 一.配置超级终端 首先,配置超级终端:在笔记本电脑上(Windows XP系统),点击开始à程序->附件->通讯->超级终端,配置名称为test的超级 ...
- [HTML5] 让IE支持HTML5的方法
越来越多的站点开始使用 HTML5 标签,但是目前的情况是还有很多人在使用IE6.IE7.IE8.为了让所有浏览者都可以正常的访问,解决方案有下面两个: 1.为网站创建多套模板,通过程序对User-A ...
- C++中值传递(pass-by-value)和引用传递(pass-by-reference)
1.pass-by-value的情况: 缺省情况C++以pass-by-value(继承C的方式)传递对象至(或来自)函数.函数参数都是以实际参数的复件为初值,调用端所获得的也是函数返回值的一个复件, ...