BZOJ1179_APIO2009_抢掠计划_C++
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1179
一道用 Tarjan 缩点+SPFA 最长路的题(Tarjan 算法:http://www.cnblogs.com/hadilo/p/5889333.html )
我们可以这样考虑,把一个连通块缩成一个点,点权为所有权值和,且只要一个点有酒吧那么该点也就有酒吧
因为当我们进入该连通块任意一个点时,显然把它里面所有的点都抢一遍才使答案最优,而且能回到原进入点,并且只要有一个有酒吧就可以选择在那里庆祝
缩完点后,就可以用 SPFA 求最长路,边权变为点权,因为里面已经没有环了,所以可以用
当然最大路也可以用 Dijkstra 或 DP 等方法做
还有这道题细节很多很多,调了我4个多小时QuQ
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<stack>
#define N 500001
using namespace std; int t,first[N],next[N],back[N],last[N],v[N],a[N],dfn[N],low[N],ans,d[N];
bool f[N],g[N],b[N];
stack<int> s;
queue<int> q;
void tarjan(int x)
{
dfn[x]=low[x]=++t;
s.push(x);
int i;
for (i=first[x];i;i=next[i])
{
if (f[v[i]]) continue;
if (dfn[v[i]]) low[x]=min(low[x],dfn[v[i]]);
else
{
tarjan(v[i]);
low[x]=min(low[x],low[v[i]]);
}
}
if (dfn[x]==low[x])
{
int k,c=first[x];
while (s.top()!=x)
{
i=c;
k=s.top();
f[k]=b[k]=;
s.pop();
a[x]+=a[k];
g[x]|=g[k];
while (next[i]) i=next[i];
next[i]=first[k];
c=i;
for (i=last[k];i;i=back[i]) v[i]=x;
}
f[s.top()]=;
s.pop();
}
}
int main()
{
int n,m,i,x,k;
scanf("%d%d",&n,&m);
for (i=;i<=m;i++)
{
scanf("%d%d",&x,&v[i]);
next[i]=first[x];
first[x]=i;
back[i]=last[v[i]];
last[v[i]]=i;
}
for (i=;i<=n;i++)
{
scanf("%d",&a[i]);
g[i]=b[i]=f[i]=;
}
scanf("%d%d",&k,&m);
for (i=;i<=m;i++)
{
scanf("%d",&x);
g[x]=;
}
tarjan(k);
for (i=;i<=n;i++) f[i]=;
d[k]=a[k];
q.push(k);
while (!q.empty())
{
k=q.front();
q.pop();
if (g[k]) ans=max(ans,d[k]);
for (i=first[k];i;i=next[i])
{
if (b[v[i]]||v[i]==k) continue;
if (d[v[i]]<d[k]+a[v[i]])
{
d[v[i]]=d[k]+a[v[i]];
q.push(v[i]);
}
}
}
cout<<ans<<endl;
return ;
}
这道题需要开无限栈,因为递归的 Tarjan 会爆栈,然而并不会手写栈
BZOJ 上幸好开了无限栈,不然就 RE 了,不过其它的 OJ 好像没有开无限栈,RE 两个点……
只好去网上下了一个代码,在 CodeVS 上交了一发手写栈的 Tarjan,终于A了orz(手写栈的戳这里: http://www.cnblogs.com/hadilo/p/5892791.html )
版权所有,转载请联系作者,违者必究
QQ:740929894
BZOJ1179_APIO2009_抢掠计划_C++的更多相关文章
- CodeVS1611_APIO2009_抢掠计划_C++
题目:http://codevs.cn/problem/1611/ 关于题解请戳这里:http://www.cnblogs.com/hadilo/p/5892765.html 下面给一个可以A的代码, ...
- P3627 [APIO2009]抢掠计划
P3627 [APIO2009]抢掠计划 Tarjan缩点+最短(最长)路 显然的缩点...... 在缩点时,顺便维护每个强连通分量的总权值 缩完点按照惯例建个新图 然后跑一遍spfa最长路,枚举每个 ...
- 【洛谷P3627】[APIO2009]抢掠计划
抢掠计划 题目链接 比较水的缩点模板题,Tarjan缩点,重新建图,记录联通块的钱数.是否有酒吧 DAG上记忆化搜索即可 #include<iostream> #include<cs ...
- 洛谷 P3627 【抢掠计划】
题库:洛谷 题号:3627 题目:抢掠计划 link:https://www.luogu.org/problem/P3627 思路 : 这道题是一道Tarjan + 最长路的题.首先,我们用Tarja ...
- APIO2009 抢掠计划 Tarjan DAG-DP
APIO2009 抢掠计划 Tarjan spfa/DAG-DP 题面 一道\(Tarjan\)缩点水题.因为可以反复经过节点,所以把一个联通快中的所有路口看做一个整体,缩点后直接跑\(spfa\)或 ...
- 题解 P3627 【[APIO2009]抢掠计划】
咕了四个小时整整一晚上 P3627 [APIO2009] 抢掠计划(https://www.luogu.org/problemnew/show/P3627) 不难看出答案即为该有向图的最长链长度(允许 ...
- [APIO2009]抢掠计划(Tarjan,SPFA)
[APIO2009]抢掠计划 题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是, ...
- [APIO2009]抢掠计划
题面: Description Siruseri城中的道路都是单向的.不同的道路由路口连接.按照法律的规定,在每个路口都设立了一个Siruseri银行的ATM取款机.令人奇怪的是,Siruseri的酒 ...
- 洛谷P3627[APOI2009] (讨厌的)抢掠计划
题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri 的酒吧也都设 ...
随机推荐
- Fruits【水果】
Fruits Many of us love July because it's the month when nature's berries and stone fruits are in abu ...
- INSERT⋯ACCEPTING_DUPLICATE_KEYS
使用ACCEPTING DUPLICATE KEYS时,当插入时发现这条记录已存在时,那么这条记录将不会被insert,后续记录继续执行insert
- 初见spark-04(高级算子)
今天,这个是spark的高级算子的讲解的最后一个章节,今天我们来介绍几个简单的算子, countByKey val rdd1 = sc.parallelize(List(("a", ...
- android 布局preview 技巧
最近开始看老外写的文章,博客,嗯,不能说比国人写的好,但是感觉看着很爽.真的,一手资料就是爽. 嗯,自己做得不错,第一次看外文博客,我知道自己怎么看的,一句话一句话看下来的,越看越有感觉. 下面这个 ...
- 抓包工具 - Fiddler - (二)
<转载自 miantest> 在上一篇中介绍了Fiddler的基本使用方法.通过上一篇的操作我们可以直接抓取浏览器的数据包.但在APP测试中,我们需要抓取手机APP上的数据包,应该怎么操作 ...
- 【转载】Unity3D研究院之共享材质的巧妙用法(sharedMaterial效率问题)
如果你需要修改模型材质的颜色,或者是修改材质Shader的一些属性, 通常情况是用获取模型的Renderer组件,然后获取它的material属性. 举个简单的例子,修改颜色或者直接更换shader ...
- Python全栈工程师(编码)
ParisGabriel Python 入门基础 补充: 主流3操作大系统 Windows: Winxp Win7 Win8 Win10 Unix: Solaris(SUN) IO ...
- 线段树 (区间更新,区间查询) poj http://poj.org/problem?id=3468
题目链接 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Python读取不同文件夹下的图片并且分类放到新创建的训练文件夹和标签文件夹
在深度学习的训练时,经常会碰到训练的样本数据集和标签数据集是在一个文件夹中,这个时候我们就不得不进行一些数据的预处理和文件的分类,例如将训练(training data)数据集和标签数据集(label ...
- NodeJS05
商品分类模块 分类model const mongoose = require('mongoose') const schema = new mongoose.Schema({ name: { typ ...