BZOJ 1179 [Apio2009]Atm(强连通分量)
【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1179
【题目大意】
给出一张有向带环点权图,给出一些终点,在路径中同一个点的点权只能累加一次,问从起点到任意终点所能得到的最大点权和。
【题解】
因为有环,所以一定存在强连通分量,我们将所有环处理成点,在SCC为点的重构图上跑SPFA最长路就可以得到答案。
【代码】
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=500010,M=500010;
int G[3][N],NXT[3][M<<1],V[3][M<<1],ed=0,f[N],q[N],t,vis[N],n,m,x,y,dp[N],val[N];
void add(int x,int y){
V[0][++ed]=y;NXT[0][ed]=G[0][x];G[0][x]=ed;
V[1][ed]=x;NXT[1][ed]=G[1][y];G[1][y]=ed;
}
void ADD(int x,int y){V[2][++ed]=y;NXT[2][ed]=G[2][x];G[2][x]=ed;}
void dfs1(int x){
vis[x]=1;
for(int i=G[0][x];i;i=NXT[0][i])if(!vis[V[0][i]])dfs1(V[0][i]);
q[++t]=x;
}
void dfs2(int x,int y){
vis[x]=0,f[x]=y;
for(int i=G[1][x];i;i=NXT[1][i])if(vis[V[1][i]])dfs2(V[1][i],y);
}
int h,td,d[N],in[N],i,j;
void spadd(int x,int y){
if(y<=d[x])return;
d[x]=y;
if(!in[x]){
in[x]=1;
if(y>d[q[h]])q[--h]=x;else q[++td]=x;
}
}
void spfa(int S){
int i,x;
for(i=h=1;i<=n;i++)d[i]=val[i],in[i]=0;d[S]=td=0;spadd(S,val[S]);
while(h!=td+1)for(i=G[2][x=q[h++]],in[x]=0;i;i=NXT[2][i])spadd(V[2][i],d[x]+val[V[2][i]]);
}
void R(int&a){
char ch;while(!((ch=getchar())>='0')&&(ch<='9'));
a=ch-'0';while(((ch=getchar())>='0')&&(ch<='9'))a*=10,a+=ch-'0';
}
int S,P;
int main(){
R(n),R(m);
for(int i=1;i<=m;i++){
R(x);R(y);
add(x,y);
}for(t=0,i=1;i<=n;i++)if(!vis[i])dfs1(i);
for(i=n;i;i--)if(vis[q[i]])dfs2(q[i],q[i]);
for(int i=1;i<=n;i++){scanf("%d",&x);val[f[i]]+=x;}
for(ed=0,i=1;i<=n;i++)for(j=G[0][i];j;j=NXT[0][j])
if(f[i]!=f[V[0][j]])ADD(f[i],f[V[0][j]]);
R(S);R(P); S=f[S]; int ans=0; spfa(S);
for(int i=1;i<=P;i++){R(x);ans=max(ans,d[f[x]]);}
printf("%d\n",ans);
return 0;
}
BZOJ 1179 [Apio2009]Atm(强连通分量)的更多相关文章
- BZOJ 1179: [Apio2009]Atm( tarjan + 最短路 )
对于一个强连通分量, 一定是整个走或者不走, 所以tarjan缩点然后跑dijkstra. ------------------------------------------------------ ...
- bzoj 1179[Apio2009]Atm (tarjan+spfa)
题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...
- bzoj 1179 [Apio2009]Atm 缩点+最短路
[Apio2009]Atm Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 4290 Solved: 1893[Submit][Status][Dis ...
- bzoj 1179: [Apio2009]Atm
Description Input 第 一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路 的起点和终点的 ...
- bzoj 1179 [Apio2009]Atm——SCC缩点+spfa
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1179 显然SCC缩点. 然后准备倒着拓扑序推到st,结果WA. 听TJ说dj求最长路会发生不 ...
- bzoj 1179: [Apio2009]Atm【tarjan+spfa】
明明优化了spfa还是好慢-- 因为只能取一次值,所以先tarjan缩点,把一个scc的点权和加起来作为新点的点权,然后建立新图.在新图上跑spfa最长路,最后把酒吧点的dis取个max就是答案. # ...
- 缩点+spfa最长路【bzoj】 1179: [Apio2009]Atm
[bzoj] 1179: [Apio2009]Atm Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri ...
- 1179: [Apio2009]Atm
1179: [Apio2009]Atm Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1629 Solved: 615[Submit][Status ...
- BZOJ 1179 Atm(强连通分量缩点+DP)
题目说可以通过一条边多次,且点权是非负的,所以如果走到图中的一个强连通分量,那么一定可以拿完这个强连通分量上的money. 所以缩点已经很明显了.缩完点之后图就是一个DAG,对于DAG可以用DP来求出 ...
随机推荐
- struts项目中添加的jar包
一般我们使用struts时,添加的jar如下: commons-fileupload-1.2.1.jar commons-io-1.3.2.jar freemarker-2.3.16.jar java ...
- accordion
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- GitHub问题之恢复本地被删除的文件
折腾了真久,GitHub commit之后,我手痒把本地的一个文件给删了,然后一直Git pull都发现不能恢复.远程库里面还是有该文件的.就是我想将远程库的文件回到本地被删除了的位置. 特别的是,我 ...
- 以Python列表特性为切入点的求质数列表的方法
一般,构造一个含有2-x之间所有质数的列表,我们采用最简单的遍历判断质数的方法: # 方法一 1 prime = [] def is_prime(n): if n <= 1: return Fa ...
- leetcode算法刷题(五)——动态规划(三)
今天的题目不是leetcode上面的.只是觉得动态规划还是不算很熟练,就接着找了点DP的题练练 最长递增子序列的长度 题目的意思:传入一个数组,要求出它的最长递增子序列的长度.例如:如在序列1,-1, ...
- 将warning设为错误
在程序编写过程中,我们有时会因为现实情况将现在无法实现的部分功能设为warning #prama warning ------------------ 为了方便查找warning,或查看某部分的警告, ...
- c/c++与java------之JNI学习(一)
一.java 调用c/c++ 步骤: 1.在java类中创建一个native关键字声明的函数 2.使用javah生成对应的.h文件 3.在c/c++中实现对应的方法 4.使用vs2012创建一个win ...
- python sys.exit()函数说明
sys.exit()函数是通过抛出异常的方式来终止进程的,也就是说如果它抛出来的异常被捕捉到了的话程序就不会退出了. #!/usr/bin/python #!coding:utf-8 import s ...
- (译)iPhone: 用公开API创建带小数点的数字键盘 (OS 3.0, OS 4.0)
(译)iPhone: 用公开API创建带小数点的数字键盘 (OS 3.0, OS 4.0) 更新:ios4.1现在已经将这个做到SDK了.你可以设置键盘类型为UIKeyboardTypeDecimal ...
- 人生第一场组队赛---2014.8 zju monthly
暑期集训中段就组了队,不过一直没机会打比赛 昨天kitkat突然发现了zju要搞月赛,我想了一下题目对于我这种渣实在是有点难,于是想到干脆打一次组队赛吧,跟队友商量了一下也同意了 12点---17点 ...