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来求出 ...
随机推荐
- Java Notes 00 - Singleton Pattern(单例总结)
转:http://hukai.me/java-notes-singleton-pattern/ 这里不赘述单例模式的概念了,直接演示几种不同的实现方式. 0)Eager initialization ...
- NodeJS学习笔记(一)——搭建开发框架Express,实现Web网站登录验证
JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器.每一种解析器都是一个运行环境,不但允许J ...
- Composer加速
在composer.json中添加{ "repositories": [ {"type": "composer", "url&qu ...
- web2py官方文档翻译
00前言 我相信能够轻松地构建高质量增长的web应用程序是至关重要的一个自由和开放的社会.这可以防止玩家最大的垄断信息的流通. 因此我从2007年开始web2py项目,主要是作为一种教学工具与简化we ...
- Windows 下 Django/python 开发环境配置
1.安装 Aptana/Eclipse Aptana是在eclipse上二次开发的一个开源的集成开发环境,内置python编译器 http://www.aptana.com/ 2. 安装python ...
- android从网络获取图片
http://blog.csdn.net/wangjinyu501/article/details/8219317 http://www.cnblogs.com/JerryWang1991/archi ...
- JLINK烧写BIN文件到nand、norflash、SDRAM
1. 简要说明 JLink的调试功能.烧写Flash的功能都很强大,但是对于S3C2410.S3C2440的Flash操作有些麻烦:烧写Nor Flash时需要设置SDRAM,否则速率很慢:烧写Nan ...
- 第52周四ApplicationContext
ApplicationContext的中文意思是"应用前后关系"应用上下文即容器,它继承自BeanFactory接口,除了包含BeanFactory的所有功能之外,在国际化支持.资 ...
- ant jsch.jar - 一个错误及解决办法
ant jsch.jar -- 一个异常及解决方法 运行build.xml出现异常: Cause: Could not load a dependent class com/jcraft/jsch/L ...
- C# DataTable转实体 通用方法【转】
public static T GetEntity<T>(DataTable table) where T : new() { T entity = new T(); ...