题目描述

样例

6 7
1 2
2 3
3 5
2 4
4 1
2 6
6 5
10
12
8
16
1 5
1 4
4
3
5
6
47

解析

题目明显是最长路,可以用spfa求最长路,但数据范围5e5明显不允许,所以我们可以用tarjan优化一下,然后这就变成了一道

tarjan板子题,先用tarjan缩点,点权为几个点之和,把所有点再存到一个数组中,再按之前建图关系,把不在一个块的点连边

再跑一遍spfa就可以了

solution


#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+5;
const int INF=0x7f7f7f7f;
int tot,head[MAXN],nxt[MAXN<<1],to[MAXN<<1],pre[MAXN],vis[MAXN],low[MAXN];
int n,m,s,st,t,h,r,c,d,cnt,now,ans,w,sum,num,val[MAXN],id[MAXN],out[MAXN];
int a[MAXN],b[MAXN],bill[MAXN],x[MAXN],y[MAXN],dis[MAXN];
void add(int x,int y)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
stack<int>p;
void tarjan(int u)
{
pre[u]=low[u]=++cnt;
p.push(u);
vis[u]=1;
for(int i=head[u];i;i=nxt[i])
{
int y=to[i];
if(!pre[y])
{
tarjan(y);
low[u]=min(low[u],low[y]);
}
else if(vis[y])
{
low[u]=min(low[u],pre[y]);
}
}
if(low[u]==pre[u])
{
num++;
int temp=-1;
while(temp!=u){
temp=p.top();
p.pop();
vis[temp]=0;
id[temp]=num;//把所有点再存到这个数组中
val[num]+=a[temp];//块点权为所有包含点之和
if(b[temp]) bill[num]=1;//如果缩进的点有酒吧,则本块又酒吧
}
}
}
queue<int>q;
void spfa()//spfa求最长路
{
memset(dis,-0x7f7f7f7f,sizeof(dis));
q.push(id[st]);
dis[id[st]]=val[id[st]];//先加上本点点权,以后跑的边的边权即为边通向点的点权
//vis[st]=true;
while(!q.empty())
{
s=q.front();
q.pop();
vis[s]=false;
for(int i=head[s];i;i=nxt[i])
{
int y=to[i];
if(dis[y]<dis[s]+val[y])//保证权值为正,不用判负环
{
dis[y]=dis[s]+val[y];
if(!vis[y])
{
q.push(y);
vis[y]=true;
}
}
}
}
ans=-INF;
for(int i=1;i<=num;i++)
{
if(bill[i]) ans=max(ans,dis[i]);//只看有酒吧的
}
printf("%d",ans);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&r,&c);
x[i]=r,y[i]=c;//记录链接点
add(r,c);
}
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
scanf("%d%d",&st,&t);
for(int i=1;i<=t;i++)
{
scanf("%d",&d);
b[d]=1;//有酒吧
}
for(int i=1;i<=n;i++)if(!pre[i]) tarjan(i);
memset(head,0,sizeof(head));//缩点后重建图,初始化
tot=0;
for(int i=1;i<=m;i++) if(id[x[i]]!=id[y[i]]) add(id[x[i]],id[y[i]]);//原本连通的点是否在同一个块中,不在的建边
spfa();
return 0;
}

Atm/抢掠计划——题解的更多相关文章

  1. 洛谷 P3627 [APIO2009]抢掠计划 题解

    Analysis 建图+强连通分量+SPFA求最长路 但要保证最后到达的点中包含酒馆 虽然思路并不难想,但要求的代码能力很高. #include<iostream> #include< ...

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

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

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

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

  4. P3627 [APIO2009]抢掠计划

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

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

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

  6. 洛谷 P3627 【抢掠计划】

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

  7. APIO2009 抢掠计划 Tarjan DAG-DP

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

  8. 运输计划(题解)(Noip2015)

    运输计划(题解)(Noip2015) 二分答案+树上差分 树上差分其实不难,只是名字高大尚,可以学一下:Eternal风度的树上差分 本人博客里也总结了一些其他的知识供大家学习:Eternal风度的博 ...

  9. p3627&bzoj1179 抢掠计划(ATM)

    传送门(洛谷) 传送门(bzoj) 题目 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruser i 银行的 ATM 取款机.令人奇怪的 ...

  10. BZOJ 1179 抢掠计划atm (缩点+有向无环图DP)

    手动博客搬家: 本文发表于20170716 10:58:18, 原地址https://blog.csdn.net/suncongbo/article/details/81061601 https:// ...

随机推荐

  1. #期望dp#CF1810G The Maximum Prefix

    洛谷题面 CF1810G 分析 考虑最大前缀和满足两个条件,就是所有前缀和都不超过,以及一定有一个等于. 那么就要保证它能达到最大值且一直不能高于它 设 \(dp[i][j][0/1]\) 表示前 \ ...

  2. #对顶堆#nssl 1477 赛

    分析 首先按小到大排序,考虑枚举两个都喜欢的个数\(i\) 那么只喜欢一个的个数各需要\(k-i\),剩下要补充到\(m-k*2+i\)个, 考虑用对顶堆维护大根堆大小仅有\(m-k*2+i\)即可 ...

  3. VS的 x86_64 , x64_86 , x64 , x86 有什么区别

    x86 Native Tools Command Prompt - Sets the environment to use 32-bit, x86-native tools to build 32-b ...

  4. 简洁,快速的bv号转av号 c++实现

    加了一部分预处理,变得更高效了 继承自朋友这里 #include <iostream> #include <string> using namespace std; const ...

  5. Native Drawing开发指导,实现HarmonyOS基本图形和字体的绘制

      场景介绍 Native Drawing模块提供了一系列的接口用于基本图形和字体的绘制.常见的应用场景举例: ● 2D图形绘制. ● 文本绘制. 接口说明 接口名 描述 OH_Drawing_Bit ...

  6. Thymeleaf SSTI模板注入分析

    环境搭建 先搭建一个SpringMVC项目,参考这篇文章,或者参考我以前的spring内存马分析那篇文章 https://blog.csdn.net/weixin_65287123/article/d ...

  7. 【7】SpringBoot是什么?SpringBoot的优缺点有哪些?

    随着动态语言的流行(Ruby.Groovy.Scala.Node.js),Java 的开发显得格外的笨重,繁多的配置.低下的开发效率.复杂的部署流程以及第三方技术集成难度大. 在上述环境下,Sprin ...

  8. TeamViewer 9发布-在Linux下安装运行

    TeamViewer 9发布-在Linux下安装运行 来源:Linux中国  作者:未知 关注我们:    这篇指南介绍了怎么样在 RedHat. CentOS. Fedora 和 Debian. U ...

  9. docker 应用篇————容器共享数据卷[十五]

    前言 简单介绍一下多个容器间容器卷共享. 正文 先启动上一节的test:2.0 这个镜像. docker run --name test01 -it test:2.0 /bin/bash 然后 ctr ...

  10. 【最简单】禁用Chrome的“请停用以开发者模式运行的扩展程序”提示

    安装油猴插件后,每次打开Chrome浏览器后右上角都会提示,"请停用以开发者模式运行的扩展程序"的一个窗口,强迫症患者表示很烦. 小白的我试过网上多数方法,有些已经失效,有些都太麻 ...