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

Solution
显然缩强连通分量,然后求最长路,虽然是DAG但还是有点麻烦,于是用了spfa。
Code
重建图_数组写错好多次,感觉做这题也就是练了一下实现。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=5e+; int pre[maxn],low[maxn],clock;
int scc[maxn],val[maxn],cnt,a[maxn],t;
int head[maxn],f[maxn],e[maxn],nxt[maxn],k;
int adde(int u,int v){
f[++k]=u,e[k]=v;
nxt[k]=head[u],head[u]=k;
}
int n,m,s,p;
int w[maxn],ok[maxn]; int dfs(int u){
//printf("%d\n",u);
pre[u]=low[u]=++clock;
a[++t]=u;
for(int i=head[u];i;i=nxt[i]){
int v=e[i];
if(!pre[v]){
dfs(v);
low[u]=min(low[u],low[v]);
}
else if(!scc[v]){
low[u]=min(low[u],pre[v]);
}
}
if(low[u]==pre[u]){
++cnt;
while(t){
scc[a[t]]=cnt;
val[cnt]+=w[a[t]];
if(a[t--]==u) break;
}
}
} int ok_[maxn];
int head_[maxn],e_[maxn],nxt_[maxn],k_;
int adde_(int u,int v){
e_[++k_]=v;
nxt_[k_]=head_[u],head_[u]=k_;
} int rebuild(){
for(int i=;i<=k;i++){
int u=scc[f[i]],v=scc[e[i]];
if(u!=v) adde_(u,v);
}
for(int i=;i<=n;i++)
if(ok[i]) ok_[scc[i]]=;
} int q[maxn],d[maxn],inque[maxn],ans,h;
int spfa(){
t=;
s=scc[s];
q[++t]=s;
inque[s]=;
d[s]=val[s];
ans=d[s];
while(h<t){
int u=q[++h];
//printf("%d\n",u);
for(int i=head_[u];i;i=nxt_[i]){
int v=e_[i];
if(d[u]+val[v]>d[v]){
//printf(" %d\n",v);
d[v]=d[u]+val[v];
if(ok_[v]) ans=max(ans,d[v]);
if(!inque[v]) inque[v]=,q[++t]=v;
}
}
inque[u]=;
}
} int main(){
scanf("%d%d",&n,&m);
int u,v,x;
for(int i=;i<=m;i++){
scanf("%d%d",&u,&v);
adde(u,v);
}
for(int i=;i<=n;i++)
scanf("%d",&w[i]);
scanf("%d%d",&s,&p);
for(int i=;i<=p;i++)
scanf("%d",&x),ok[x]=; for(int i=;i<=n;i++)
if(!pre[i]) dfs(i); rebuild();
spfa();
printf("%d\n",ans);
return ;
}
【强连通分量+spfa】Bzoj1179 Apio2009 Atm的更多相关文章
- bzoj1179: [Apio2009]Atm 【缩点+spfa最长路】
题目传送门 Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruser i 银行的 ATM 取款机.令人奇怪的是,S ...
- BZOJ1179 [Apio2009]Atm Tarjan 强连通缩点 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1179 题意概括 有一个有向图,每一个节点有一个权值,其中有一些结束点. 现在,你要从S出发,到达任 ...
- BZOJ1179 : [Apio2009]Atm 缩点+spfa
1179: [Apio2009]Atm Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 2069 Solved: 826[Submit][Status ...
- 【Tarjan】+【SPFA】APIO2009 Atm
一.算法介绍 tarjan——求解有向图强连通分量.这个算法在本人的一篇blog中有介绍,这里就不赘述了.贴上介绍tarjan的的blog链接:http://www.cnblogs.com/Maki- ...
- BZOJ1179 [Apio2009]Atm 【tarjan缩点】
1179: [Apio2009]Atm Time Limit: 15 Sec Memory Limit: 162 MB Submit: 4048 Solved: 1762 [Submit][Sta ...
- 【强联通分量缩点】【最短路】【spfa】bzoj1179 [Apio2009]Atm
缩点后转化成 DAG图上的单源最长路问题.spfa/dp随便. #include<cstdio> #include<queue> #include<algorithm&g ...
- [BZOJ1179] [Apio2009]Atm(tarjan缩点 + spfa)
传送门 题意 N个点M条边的有向图 每个点有点权 从某一个结点出发 问能获得的最大点权和 一个点的点权最多被计算一次 N<=500000 M<=500000 思路 先tarjan缩点,然后 ...
- bzoj1179 [Apio2009]Atm
Description Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口 ...
- bzoj1179: [Apio2009]Atm scc缩点+dag上dp
先把强连通缩点,然后变成了dag,dp求终点是酒吧的最长路即可, /************************************************************** Pro ...
随机推荐
- Java中使用有返回值的线程
在创建多线程程序的时候,我们常实现Runnable接口,Runnable没有返回值,要想获得返回值,Java5提供了一个新的接口Callable,可以获取线程中的返回值,但是获取线程的返回值的时候,需 ...
- 基础概念:Oracle数据库、实例、用户、表空间、表之间的关系
基础概念:Oracle数据库.实例.用户.表空间.表之间的关系 数据库: Oracle数据库是数据的物理存储.这就包括(数据文件ORA或者DBF.控制文件.联机日志.参数文件).其实Oracle数据库 ...
- java核心卷轴之集合
1. Iterator 1.1 注意事项 接口的remove方法将删除上次调用next方式时返回的对象,即:remove之前,必须有next(先获取,再删除). 1.2 例一:删除字符串集合中的第一个 ...
- 洛谷P1919 【模板】A*B Problem升级版 题解(FFT的第一次实战)
洛谷P1919 [模板]A*B Problem升级版(FFT快速傅里叶) 刚学了FFT,我们来刷一道模板题. 题目描述 给定两个长度为 n 的两个十进制数,求它们的乘积. n<=100000 如 ...
- 完美支持Py3的微信开发库推荐
之前分享了个代码,后来发现中文发送是乱码,应该是加密代码的问题,然后在又找到这个可完美使用的Py3微信库wechatpy:https://github.com/jxtech/wechatpy
- C# 使用SmtpClient发送Email
使用Winfrom写的报错信息发送邮件通知. 以下主要代码 /// <summary> /// 发送邮件核心代码 /// </summary> /// <param na ...
- Myeclipse使用git
推荐使用服务器:coding,coding的上传很稳定很快 怎么建仓库: coding 这个服务器呢有个很明显的东西就是太的语言可以是中文的, 点头标签的加号就能进行创建仓库了 点击新建就行了 点击这 ...
- Qt5.7 实现Https 认证全过程解析(亲自动手版)
#### NetworkRequestManager.h #include <QSsl>#include <QSslKey>#include <QSslSocket> ...
- 实现MyArrayList类深入理解ArrayList
ArrayList简介 ArrayList是一个动态数组,Array的复杂版本,它提供了动态的增加和减少元素,实现了ICollection和IList接口,灵活的设置数组的大小等好处. MyArray ...
- Centos6.5DRBD加载失败,系统更换yum源(国内163)
我安装的系统是centos6.5的,要在系统上安装DRBD镜像软件,安装完后,无法加载modprobe drbd. 需要更新kernel. 1,首先,先把yum源更换成国内的,不然无法更新kernel ...