BZOJ_1179_[Apio2009]Atm_tarjan+spfa
BZOJ_1179_[Apio2009]Atm_tarjan+spfa
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1179
分析:
显然有环没法直接最长路,那就缩个点再跑。
酒吧连汇点。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 500050
int head[N],to[N<<1],nxt[N<<1],val[N],can[N],cancan[N];
int n,m,bel[N],dfn[N],low[N],st[N],top,scc,tot,cnt,S,T;
int ins[N],sum[N],X[N],Y[N],Q[N],l,r,dis[N],inq[N];
inline void add(int u,int v){
to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;
}
void tarjan(int x){
st[top++]=x;ins[x]=1;dfn[x]=low[x]=++tot;
for(int i=head[x];i;i=nxt[i]){
if(!dfn[to[i]]){
tarjan(to[i]);
low[x]=min(low[x],low[to[i]]);
}else if(ins[to[i]])low[x]=min(low[x],dfn[to[i]]);
}
if(dfn[x]==low[x]){
int t=st[--top];ins[t]=0;
bel[t]=++scc;
sum[scc]+=val[t];
cancan[scc]|=can[t];
while(t!=x){
t=st[--top];ins[t]=0;
bel[t]=scc;
sum[scc]+=val[t];
cancan[scc]|=can[t];
}
}
}
int main(){
scanf("%d%d",&n,&m);
int x,y;
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
add(x,y);
X[i]=x,Y[i]=y;
}
for(int i=1;i<=n;i++){
scanf("%d",&val[i]);
}
scanf("%d%d",&S,&x);
T=n+1;
for(int i=1;i<=x;i++){
scanf("%d",&y);
can[y]=1;
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
memset(head,0,sizeof(head));cnt=0;
for(int i=1;i<=m;i++){
if(bel[X[i]]!=bel[Y[i]])add(bel[X[i]],bel[Y[i]]);
}
for(int i=1;i<=scc;i++)if(cancan[i])add(i,T);
S=bel[S];
Q[r++]=S;inq[S]=1;dis[S]=sum[S];
while(l^r){
int x=Q[l++];inq[x]=0;if(l==n+10)l=0;
for(int i=head[x];i;i=nxt[i]){
if(dis[to[i]]<dis[x]+sum[to[i]]){
dis[to[i]]=dis[x]+sum[to[i]];
if(!inq[to[i]]){
inq[to[i]]=1;Q[r++]=to[i];if(r==n+10)r=0;
}
}
}
}
printf("%d",dis[T]);
}
BZOJ_1179_[Apio2009]Atm_tarjan+spfa的更多相关文章
- 【Tarjan】+【SPFA】APIO2009 Atm
一.算法介绍 tarjan——求解有向图强连通分量.这个算法在本人的一篇blog中有介绍,这里就不赘述了.贴上介绍tarjan的的blog链接:http://www.cnblogs.com/Maki- ...
- 缩点+spfa最长路【bzoj】 1179: [Apio2009]Atm
[bzoj] 1179: [Apio2009]Atm Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri ...
- [BZOJ1179][APIO2009][强连通分量Tarjan+spfa]ATM
[BZOJ1179][APIO2009]ATM Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i ...
- BZOJ1179 : [Apio2009]Atm 缩点+spfa
1179: [Apio2009]Atm Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 2069 Solved: 826[Submit][Status ...
- [APIO2009]抢掠计划(Tarjan,SPFA)
[APIO2009]抢掠计划 题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是, ...
- bzoj 1179[Apio2009]Atm (tarjan+spfa)
题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...
- 【BZOJ1179】 [Apio2009]Atm tarjan缩点+SPFA
Description Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口 ...
- 【BZOJ】1179: [Apio2009]Atm(tarjan+spfa)
http://www.lydsy.com/JudgeOnline/problem.php?id=1179 缩点建图... #include <cstdio> #include <cs ...
- 【强连通分量+spfa】Bzoj1179 Apio2009 Atm
Description Solution 显然缩强连通分量,然后求最长路,虽然是DAG但还是有点麻烦,于是用了spfa. Code 重建图_数组写错好多次,感觉做这题也就是练了一下实现. #inclu ...
随机推荐
- CSS3实现多样的边框效果
半透明边框 实现效果: 实现代码: <div> 你能看到半透明的边框吗? </div> div { /* 关键代码 */ border: 10px solid rgba(255 ...
- Java复习2.程序内存管理
前言: 国庆节的第三天,大家都回家了,一个人在宿舍好无聊.不过这年头与其说是出去玩不如是说出去挤,所以在学校里还是清闲的好.找工作不用担心了,到时候看着你们慢慢忙:插个话题,大学都没有恋爱过,总之各种 ...
- Pascal Triangle
Description: Given numRows, generate the first numRows of Pascal's triangle. For example, given numR ...
- C#学习笔记 day_two
C#学习笔记 day two Chapter 2 c#基本概念 2.1编译与运行hello world应用程序 点击f5或者vs2010中的运行图标即可 2.3C#的概念拓展 (1)继承性:一个类含有 ...
- Tomcat配置多实例:centos和winserver环境
CentOS:配置多Tomcat: 1.下载:# wget http://mirrors.cnnic.cn/apache/tomcat/tomcat-6/v6.0.44/bin/apache- ...
- python 正则表达式Re
Python正则表达式指南这篇文章很好,推荐阅读. 本文则是简单记录下我自己学习Re的笔记, 环境是python3.5. 1.简单的Re语法 ^ 匹配字符串开始位置. $ 匹配字符串结束位置. \b ...
- JavaScript 字符串反转
第一种方法:使用内置方法 split()方法将一个字符串对象的每个字符拆出来,并且将每个字符串当成数组的每个元素 reverse()方法用来改变数组,将数组中的元素倒个序排列,第一个数组元素成为最后一 ...
- .NET开发微信小程序-接收微信支付回调数据
获取微信支付传回来的数据 1.MVC控制器 /// <summary> /// 付款返回的数据 /// </summary> /// <returns></r ...
- 基于Kafka Connect框架DataPipeline可以更好地解决哪些企业数据集成难题?
DataPipeline已经完成了很多优化和提升工作,可以很好地解决当前企业数据集成面临的很多核心难题. 1. 任务的独立性与全局性. 从Kafka设计之初,就遵从从源端到目的的解耦性.下游可以有很多 ...
- MYSQL数据库设计规范与原则
MYSQL数据库设计规范 1.数据库命名规范 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成; 命名简洁明确(长度不能超过30个字符); 例如:user, stat ...