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的更多相关文章

  1. 【Tarjan】+【SPFA】APIO2009 Atm

    一.算法介绍 tarjan——求解有向图强连通分量.这个算法在本人的一篇blog中有介绍,这里就不赘述了.贴上介绍tarjan的的blog链接:http://www.cnblogs.com/Maki- ...

  2. 缩点+spfa最长路【bzoj】 1179: [Apio2009]Atm

    [bzoj] 1179: [Apio2009]Atm Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri ...

  3. [BZOJ1179][APIO2009][强连通分量Tarjan+spfa]ATM

    [BZOJ1179][APIO2009]ATM Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i ...

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

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

  5. [APIO2009]抢掠计划(Tarjan,SPFA)

    [APIO2009]抢掠计划 题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是, ...

  6. bzoj 1179[Apio2009]Atm (tarjan+spfa)

    题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...

  7. 【BZOJ1179】 [Apio2009]Atm tarjan缩点+SPFA

    Description Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口 ...

  8. 【BZOJ】1179: [Apio2009]Atm(tarjan+spfa)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1179 缩点建图... #include <cstdio> #include <cs ...

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

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

随机推荐

  1. 听晴明老师从头讲React Native(原价399)百度云下载 百度网盘

    适用人群 能使用至少一门主流编程语言:有基本的面向对象的概念:最好有一些web相关的知识和概念. 课程概述 新颖.实用.详尽的ReactNative零基础课程,由国内权威的ReactNative中文网 ...

  2. CoolBlog开发笔记第5课:请求与响应

    教程目录 1.1 CoolBlog开发笔记第1课:项目分析 1.2 CoolBlog开发笔记第2课:搭建开发环境 1.3 CoolBlog开发笔记第3课:创建Django应用 1.4 CoolBlog ...

  3. 如何安装Pycharm官方统计代码行插件

    最近一直想统计Pycharm的总计代码行数,找到了官方的统计行数插件,发现效果还不错. 官方代码统计插件指导: https://plugins.jetbrains.com/plugin/4509-st ...

  4. 多重影分身——C#中多线程的使用三(调用方法和传参)

    对Thread: 1.使用ThreadStart static void Main(string[] args) { Thread th1=new Thread(new ThreadStart(Say ...

  5. Apache Solr vs Elasticsearch

    http://solr-vs-elasticsearch.com/ Apache Solr vs Elasticsearch The Feature Smackdown API Feature Sol ...

  6. flex调用JS报安全沙箱错误解决办法

    flex调用JS方法弹窗时一般会报安全沙箱错误,只要将被调用的JS方法设置延时就可解决. function openKqQuery(){ window.showModalDialog("pa ...

  7. js实现地图打印功能

    注意:js对地图的打印功能在arcgis10.1中才有提供,所以如果要使用esri自带的地图打印功能,必须使用arcgis 10.1或更高版本的地图打印模板.(由于官网和arcgis desktop提 ...

  8. self,和类实例化加不加括号的理解

    # class Dog(object): # def talk(self): # print('汪汪~~~') # print(self) # self就是对象,默认将对象传递到类方法,self不需要 ...

  9. Netty中如何序列化数据

    JDK提供了ObjectOutputStream和ObjectInputStream,用于通过网络对POJO的基本数据类型和图进行序列化和反序列化.该API并不复杂,而且可以被应用于任何实现了java ...

  10. mysql 创建用户

    以管理员方式打开cmd命令提示符进入MySql的Bin目录下 一.以管理员身份登录mysql 密码不隐藏的登录方式:mysql -u root -p 123456 密码隐藏的登录方式:mysql -u ...