Atm/抢掠计划——题解
题目描述

样例
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/抢掠计划——题解的更多相关文章
- 洛谷 P3627 [APIO2009]抢掠计划 题解
Analysis 建图+强连通分量+SPFA求最长路 但要保证最后到达的点中包含酒馆 虽然思路并不难想,但要求的代码能力很高. #include<iostream> #include< ...
- 题解 P3627 【[APIO2009]抢掠计划】
咕了四个小时整整一晚上 P3627 [APIO2009] 抢掠计划(https://www.luogu.org/problemnew/show/P3627) 不难看出答案即为该有向图的最长链长度(允许 ...
- [APIO2009]抢掠计划(Tarjan,SPFA)
[APIO2009]抢掠计划 题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是, ...
- 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\)或 ...
- 运输计划(题解)(Noip2015)
运输计划(题解)(Noip2015) 二分答案+树上差分 树上差分其实不难,只是名字高大尚,可以学一下:Eternal风度的树上差分 本人博客里也总结了一些其他的知识供大家学习:Eternal风度的博 ...
- p3627&bzoj1179 抢掠计划(ATM)
传送门(洛谷) 传送门(bzoj) 题目 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruser i 银行的 ATM 取款机.令人奇怪的 ...
- BZOJ 1179 抢掠计划atm (缩点+有向无环图DP)
手动博客搬家: 本文发表于20170716 10:58:18, 原地址https://blog.csdn.net/suncongbo/article/details/81061601 https:// ...
随机推荐
- Advanced .Net Debugging 6:程序集加载器
一.简介 这是我的<Advanced .Net Debugging>这个系列的第六篇文章.这篇文章的内容是原书的第二部分的[调试实战]的第四章.这章主要讲的是程序集加载器,比如:CLR 加 ...
- 批量拉取/git pull 指定文件夹下面所有 Git 项目的最新代码
背景 因为工作需要,当前所负责的项目较多:但是人力紧缺,其中绝大部分项目平时也不会去跟进迭代.所以经常需要批量拉取最新的代码查看最新的改动. 解决方案 一键批量拉取指定文件夹下所有 Git 项目的最新 ...
- Jetty的bytebufferpool模块
bytebufferpool模块用于配置Jetty的ByteBuffer对象的对象池. 通过对象池的方式来管理ByteBuffer对象的使用和生命周期,期望降低Jetty进程内存的使用,同时降低JVM ...
- 学会在 C++ 中使用变量:从定义到实践
C++ 变量 变量是用于存储数据值的容器. 在 C++ 中,有不同类型的变量(使用不同的关键字定义),例如: int - 存储整数(没有小数点),例如 123 或 -123 double - 存储浮点 ...
- SQL 数据操作技巧:SELECT INTO、INSERT INTO SELECT 和 CASE 语句详解
SQL SELECT INTO 语句 SELECT INTO 语句将数据从一个表复制到一个新表中. SELECT INTO 语法 将所有列复制到新表中: SELECT * INTO newtable ...
- Seaborn分布数据可视化---统计分布图
统计分布图 barplot() sns.barplot( x=None, y=None, hue=None, data=None, order=None, hue_order=None, estima ...
- Qt 实现涂鸦板三:实现鼠标绘制矩形
.h 文件 #pragma once #include <QtWidgets/QWidget> #include "ui_xuexi.h" #include " ...
- Qt 实现涂鸦板二:实现放大功能
在一的基础上改造: .h 文件 #pragma once #include <QtWidgets/QWidget> #include "ui_xuexi.h" #inc ...
- openGauss数据库将磁盘表转换为MOT
openGauss 数据库将磁盘表转换为 MOT 一.将磁盘表转换为 MOT 方法 磁盘表直接转换为 MOT 尚不能实现,这意味着尚不存在将基于磁盘的表转换为 MOT 的 ALTER TABLE 语句 ...
- MogDB 使用向量化执行引擎进行调优
MogDB 使用向量化执行引擎进行调优 本文出处:https://www.modb.pro/db/430318 MogDB 数据库支持行执行引擎和向量化执行引擎,分别对应行存表和列存表. 一次一个 b ...