Analysis

建图+强连通分量+SPFA求最长路

但要保证最后到达的点中包含酒馆

虽然思路并不难想,但要求的代码能力很高。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxn 500010
using namespace std;
inline int read()
{
int x=;
bool f=;
char c=getchar();
for(; !isdigit(c); c=getchar()) if(c=='-') f=;
for(; isdigit(c); c=getchar()) x=(x<<)+(x<<)+c-'';
if(f) return x;
return -x;
}
inline void write(int x)
{
if(x<){putchar('-');x=-x;}
if(x>)write(x/);
putchar(x%+'');
}
struct node
{
int from,to,val,nex;
}edge[*maxn];
int n,m,s,p,cnt,ans,top,inl,num;
int x[maxn],y[maxn],head[maxn],dfn[maxn],low[maxn],st[maxn],inn[maxn],sum[maxn],si[maxn],money[maxn],dis[maxn];
bool book[maxn],book1[maxn],bar[maxn];
inline void clear()
{
cnt=;
memset(edge,,sizeof(edge));
memset(head,,sizeof(head));
}
inline void add(int x,int y)
{
cnt++;
edge[cnt].to=y;
edge[cnt].nex=head[x];
head[x]=cnt;
}
inline void build(int x,int y,int z)
{
cnt++;
edge[cnt].from=x;
edge[cnt].to=y;
edge[cnt].val=z;
edge[cnt].nex=head[x];
head[x]=cnt;
}
inline void Tarjan(int u)
{
dfn[u]=low[u]=++num;
st[++top]=u;
for(int i=head[u];i;i=edge[i].nex)
{
int v=edge[i].to;
if(!dfn[v])
{
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(!inn[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
inn[u]=++inl;
while(st[top]!=u)
{
if(bar[st[top]])book1[inl]=;
sum[inl]+=money[st[top]];
inn[st[top]]=inl;
--top;
}
if(bar[st[top]])book1[inl]=;
sum[inl]+=money[st[top]];
--top;
}
}
inline void spfa()
{
memset(book,,sizeof(book));
for(int i=;i<=n;i++) dis[i]=;
queue<int> q;
q.push(inn[s]);
book[inn[s]]=;
dis[inn[s]]=sum[inn[s]];
while(!q.empty())
{
for(int i=head[q.front()];i;i=edge[i].nex)
{
if(dis[edge[i].to]<dis[edge[i].from]+edge[i].val)
{
dis[edge[i].to]=dis[edge[i].from]+edge[i].val;
if(book[edge[i].to]==)
{
q.push(edge[i].to);
book[edge[i].to]=;
}
}
}
book[q.front()]=;
q.pop();
}
}
int main()
{
n=read();m=read();
for(int i=;i<=m;i++)
{
x[i]=read();y[i]=read();
add(x[i],y[i]);
}
for(int i=;i<=n;i++)money[i]=read();
s=read();p=read(); for(int i=;i<=p;i++)
{
int x;
x=read();
bar[x]=;
}
for(int i=;i<=n;i++)
if(!dfn[i])
Tarjan(i); clear();
for(int i=;i<=m;i++)
if(inn[x[i]]!=inn[y[i]])
build(inn[x[i]],inn[y[i]],sum[inn[y[i]]]);
spfa();
for(int i=;i<=inl;i++)
if(book1[i]==)
ans=max(ans,dis[i]);
write(ans);
return ;
}
请各位大佬斧正(反正我不认识斧正是什么意思)

洛谷 P3627 [APIO2009]抢掠计划 题解的更多相关文章

  1. 【题解】洛谷P3627 [APIO2009]抢掠计划(缩点+SPFA)

    洛谷P3627:https://www.luogu.org/problemnew/show/P3627 思路 由于有强连通分量 所以我们可以想到先把整个图缩点 缩点完之后再建一次图 把点权改为边权 并 ...

  2. 洛谷 P3627 [APIO2009]抢掠计划 Tarjan缩点+Spfa求最长路

    题目地址:https://www.luogu.com.cn/problem/P3627 第一次寒假训练的结测题,思路本身不难,但对于我这个码力蒟蒻来说实现难度不小-考试时肛了将近两个半小时才刚肛出来. ...

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

    题目大意:给你一张$n(n\leqslant5\times10^5)$个点$m(m\leqslant5\times10^5)$条边的有向图,有点权,给你起点和一些可能的终点.问从起点开始,到任意一个终 ...

  4. 洛谷 P3627 [APIO2009]抢掠计划

    这题一看就是缩点,但是缩完点怎么办呢?首先我们把所有的包含酒吧的缩点找出来,打上标记,然后建立一张新图, 每个缩点上的点权就是他所包含的所有点的点权和.但是建图的时候要注意,每一对缩点之间可能有多条边 ...

  5. 洛谷 P3627 【抢掠计划】

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

  6. BZOJ1179或洛谷3672 [APIO2009]抢掠计划

    BZOJ原题链接 洛谷原题链接 在一个强连通分量里的\(ATM\)机显然都可被抢,所以先用\(tarjan\)找强连通分量并缩点,在缩点的后的\(DAG\)上跑最长路,然后扫一遍酒吧记录答案即可. # ...

  7. 洛谷3627 [APIO2009]抢掠计划

    题目描述 输入格式: 第一行包含两个整数 N.M.N 表示路口的个数,M 表示道路条数.接下来 M 行,每行两个整数,这两个整数都在 1 到 N 之间,第 i+1 行的两个整数表示第 i 条道路的起点 ...

  8. P3627 [APIO2009]抢掠计划

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

  9. 洛谷 P3627 [APIO2009](抢掠计划 缩点+spfa)

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

随机推荐

  1. C++根据用户输入打印对应的金层塔层数

    #include <iostream> #include <Windows.h> using namespace std; int main(void) { int row; ...

  2. C/C++中内存泄漏、内存溢出与野指针的解释与说明

    1.内存泄漏 内存泄漏是指我们在堆中申请(new/malloc)了一块内存,但是没有去手动的释放(delete/free)内存,导致指针已经消失,而指针指向的东西还在,已经不能控制这块内存, 所以就是 ...

  3. vagrant root 登录虚拟机

    这个问题本来觉得是个特别简单的问题,昨天弄的时候折腾了半晚上.所以打算记录下过程,主要也被网上的各种信息误导了. 1 先看下我这vagrant配置信息 Vagrant.configure(" ...

  4. YIii2.0-学习笔记之服务器安装

    最近项目需要,学习了一下yii2.0框架 第一步:  安装composer--------作为一个phper  composer不会用可能有点不合适 下载composer.phar文件 #curl - ...

  5. SaltStack实现动态文件分发,支持脚本换行,中文乱码

    场景:将动态脚本分发到各个机器的指定目录下 说明:使用SaltStack的 file.managed file.managed 里面可以定义内容的几种方式 - source: - contents: ...

  6. R_数据视觉化处理_初阶_02

    通过数据创建一幅简单的图像, #Crate a easy photopdf("mygraph.pdf") attach(mtcars) plot(wt,mpg) abline(lm ...

  7. Python初识面向对象

    初识面向对象 面向过程 VS 面向对象 面向过程的圣墟设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西 优点是:极大的降低 ...

  8. php中的特殊标签

    参考:https://www.freebuf.com/column/212586.html 今天看到这篇文章讲到了ctf中的一些关于php标签的小姿势,我虽然不打ctf,但是平常做php的代码审计也经 ...

  9. oracle trunc函数用法

    转自:https://www.e-learn.cn/content/qita/699481 /**************日期********************/ select trunc(sy ...

  10. Subversion和TortoiseSVN,VisualSVN图文教程

    转自:http://www.veryhuo.com/a/view/156054.html 本文为大家介绍一下SVN使用教程,在开始之前,您有必要了解一下为什么要使用SVN?因为程序员在编写程序的过程中 ...