题目: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++的更多相关文章

  1. CodeVS1611_APIO2009_抢掠计划_C++

    题目:http://codevs.cn/problem/1611/ 关于题解请戳这里:http://www.cnblogs.com/hadilo/p/5892765.html 下面给一个可以A的代码, ...

  2. P3627 [APIO2009]抢掠计划

    P3627 [APIO2009]抢掠计划 Tarjan缩点+最短(最长)路 显然的缩点...... 在缩点时,顺便维护每个强连通分量的总权值 缩完点按照惯例建个新图 然后跑一遍spfa最长路,枚举每个 ...

  3. 【洛谷P3627】[APIO2009]抢掠计划

    抢掠计划 题目链接 比较水的缩点模板题,Tarjan缩点,重新建图,记录联通块的钱数.是否有酒吧 DAG上记忆化搜索即可 #include<iostream> #include<cs ...

  4. 洛谷 P3627 【抢掠计划】

    题库:洛谷 题号:3627 题目:抢掠计划 link:https://www.luogu.org/problem/P3627 思路 : 这道题是一道Tarjan + 最长路的题.首先,我们用Tarja ...

  5. APIO2009 抢掠计划 Tarjan DAG-DP

    APIO2009 抢掠计划 Tarjan spfa/DAG-DP 题面 一道\(Tarjan\)缩点水题.因为可以反复经过节点,所以把一个联通快中的所有路口看做一个整体,缩点后直接跑\(spfa\)或 ...

  6. 题解 P3627 【[APIO2009]抢掠计划】

    咕了四个小时整整一晚上 P3627 [APIO2009] 抢掠计划(https://www.luogu.org/problemnew/show/P3627) 不难看出答案即为该有向图的最长链长度(允许 ...

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

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

  8. [APIO2009]抢掠计划

    题面: Description Siruseri城中的道路都是单向的.不同的道路由路口连接.按照法律的规定,在每个路口都设立了一个Siruseri银行的ATM取款机.令人奇怪的是,Siruseri的酒 ...

  9. 洛谷P3627[APOI2009] (讨厌的)抢掠计划

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

随机推荐

  1. R-描述性统计

    RT...老实说这一章我是抖的...但是,加油- # 从1:100中均匀抽取size个数据,replace=TRUE指有放回抽样,数据可以重复 x = sample(1:100, size = 100 ...

  2. Python系列6之面向对象

    目录 生成器和迭代器 字符串格式化 内置函数vars 反射 面向对象编程 一. 生成器和迭代器  1. 生成器 生成器具有一种生成的能力,它仅仅代表着一种生成的能力,当我们需要使用的时候,才会通过迭代 ...

  3. 笔记-mysql-管理及基础操作

    笔记-mysql使用-管理及基础操作 1.      简介 mysql是一个免费的关系型数据库,不过好像被oracle收购了.... 希望它继续免费. 1.1.    相关术语 数据库,表,列,行,冗 ...

  4. 实时查询引擎 - Facebook Presto 介绍与应用

    1. Presto 是什么   Facebook presto是什么,继Facebook创建了HIVE神器后的又一以SQL语言作为接口的分布式实时查询引擎,可以对PB级的数据进行快速的交互式查询.它支 ...

  5. SpringMVC---springMVC配置文件(springweb.xml)简介

    再web.xml中设置HTTP请求的中央调度处理器DispatcherServlet时,会指定SpringMVC配置文件,这里取名springweb.xml是因设置DispatcherServlet时 ...

  6. java从数据库读取菜单,递归生成菜单树

    首先看一下菜单的样子 根据这个样子我们定义菜单类 public class Menu { // 菜单id private String id; // 菜单名称 private String name; ...

  7. mutable c++

    The keyword mutable is used to allow a particular data member of const object to be modified. This i ...

  8. U盘的容量变小了怎么办?

    之前买了个U盘,后来给朋友装系统弄成U盘启动盘了,就发现U盘容量变少了几百兆,原来是因为做U盘启动盘的时候,U盘启动盘制作软件都是把写入U盘的PE文件隐藏了,防止用户不小心删除文件. 所以说这些空间应 ...

  9. web前端开发总结(未完)

    由于我也是接触前端开发不久,所以呢,自己也会做点小功课,于是,我把前端能够用到的知识稍稍做了下总结,总结的不全面,以后会慢慢完善的! 移动前端开发基础 (总结----待完善)1.移动前端开发:简而言之 ...

  10. 常用模块(string)

    import string# dt = string.digits # 获取0-9的数字# dt = string.ascii_letters # 获取所有的大小写字母# dt = string.he ...